MAT工具分析Dump文件(大对象定位)
前段时间线上服务经常发生卡顿,经过排查发现是大对象引起的Fullgc问题,特此记录排查逻辑。
目的
定位产生大对象的代码
一、获得服务进程
jps -l
27885\32474 对应的即为运行的Jar
ps:也可使用netstat -lnput|grep 启动端口号 等方式查找
二、生成dump文件
jmap -dump:format=b,file=文件路径及名字.dump 上步获得进程号
#jmap -dump:format=b,file=test.dump 27885
三、下载mat工具
四、使用mat工具导入第二步生成的dump文件
五、导入后得到如下界面
六、定位大对象(方法一)
-
点击上图中Histogram,可显示出每个类产生的实例数量,以及所占用的内存大小;
Shallow Heap 和 Retained Heap分别表示对象自身不包含引用的大小和对象自身并包含引用的大小。默认的大小单位是 Bytes,可以在 Window - Preferences 菜单中设置单位,图中设置的是KB。 -
根据Shallow Heap 和 Retained Heap找出占用最大的对象(下图)
红框内就是我的包路径,这时已经大概知道是什么对象占用了,去项目中检查大概率能定位,我遇到的是一次性查出全部的数据,太多导致。
七、定位大对象(方法二)
点击第五步图中 Leak Suspects 后,MAT会自动分析生成一份报告,通过报告,也能判断出和上一步一样的结果
最后,找到代码位置了,其他就是要分析具体是什么原因导致产生大对象。针对问题进行代码、JVM、业务需求优化。