jvm调优中,经常使用dump来分析是否存在大对象导致频繁full gc,以下为使用步骤:
一、获得服务进程
二、生成dump文件
jmap -dump:format=b,file=xxx.dump pid
三、下载mat工具
地址:https://www.eclipse.org/mat/downloads.php
注意,12及以上版本需要安装jdk11以上
四、导入dump文件
五、导入后得到如下界面
六、定位大对象(方法一)
点击上图中Histogram,可显示出每个类产生的实例数量,以及所占用的内存大小;
Shallow Heap 和 Retained Heap分别表示对象自身不包含引用的大小和对象自身并包含引用的大小。默认的大小单位是 Bytes,可以在 Window - Preferences 菜单中设置单位,图中设置的是KB。
根据Shallow Heap 和 Retained Heap找出占用最大的对象(下图)
红框内就是我的包路径,这时已经大概知道是什么对象占用了,去项目中检查大概率能定位,我遇到的是一次性查出全部的数据,太多导致。
七、定位大对象(方法二)
点击第五步图中 Leak Suspects 后,MAT会自动分析生成一份报告,通过报告,也能判断出和上一步一样的结果
最后,找到代码位置了,其他就是要分析具体是什么原因导致产生大对象。针对问题进行代码、JVM、业务需求优化。