MAT工具分析Dump文件(大对象定位)

前段时间线上服务经常发生卡顿,经过排查发现是大对象引起的Fullgc问题,特此记录排查逻辑。

目的

定位产生大对象的代码

一、获得服务进程

jps -l 

image-20210506143053217

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文件

image-20210506143902057

五、导入后得到如下界面

image-20210507094559141

六、定位大对象(方法一)

  1. 点击上图中Histogram,可显示出每个类产生的实例数量,以及所占用的内存大小;
    Shallow Heap 和 Retained Heap分别表示对象自身不包含引用的大小和对象自身并包含引用的大小。默认的大小单位是 Bytes,可以在 Window - Preferences 菜单中设置单位,图中设置的是KB。

  2. 根据Shallow Heap 和 Retained Heap找出占用最大的对象(下图)

    红框内就是我的包路径,这时已经大概知道是什么对象占用了,去项目中检查大概率能定位,我遇到的是一次性查出全部的数据,太多导致。image-20210507161153347

七、定位大对象(方法二)

点击第五步图中 Leak Suspects 后,MAT会自动分析生成一份报告,通过报告,也能判断出和上一步一样的结果

最后,找到代码位置了,其他就是要分析具体是什么原因导致产生大对象。针对问题进行代码、JVM、业务需求优化。

参考

posted @ 2021-05-07 16:38  RollBack2010  阅读(3005)  评论(0编辑  收藏  举报