对于我们在现实的场景中,或多或少会遇到内存溢出的问题,可怎么排查这个问题呢?
首先我们需要了解一下关于java中自身安装自带的几个命令:jmap,Jvisualvm,jstack等。一般情况下,对于内存,cpu,线程的监控用Jvisualvm
这个命令我们很清晰的能查看系统的运行情况。
如果我们需要定位内存溢出的代码,就必须用jmap导出此时的对文件,用MAT工具进行查看。我看了很多的博客说eclipse如何集成MAT。
其实,eclipse不用集成MAT,我们去MAT官网下载:点击打开链接下载解压,直接点击里面的MemoryAnalyzer.exe就可以了,添加我们dump的堆文件就可以解析了。对于对文件的dump,我们用jmap命令:
jmap -dump:format=b,file=C:/dump/dump.bin 7098
//注意这个7089就是我们运行的系统的pid,可以通过jsp进行查看
然后用MemoryAnalyzer打开:
红色部分,就是我们要重点看的,通过第二个圈,可以看出内存都累计在数组中,接下来我们看Details:
就可以发现是一个集合中在不停的放User对象。