由于前段时间生产遇到JVM问题,需要分析dump文件,如果对相关分析工具没有使用过的小伙伴来说可能懵圈,这里介绍一下MAT工具排查问题的使用方法;
1.MAT安装
没有安装过的小伙伴先点 这里 进行下载;解压之后包含以下文件:
打开MemoryAnalyzer.ini,修改JVM堆参数(注意:修改堆大小需要超过你分析的hprof 文件的大小,我这里做教程就定义为1024M):
配置完成后,点击MemoryAnalyzer.exe启动;
2.准备一份dump文件
在开始使用MAT分析dump文件之前,先制作一份OOM的dump文件;
启动IDEA/Eclipse,新建测试类:
public class DumpTest {
List<byte[]> byteArrayList = new ArrayList();
@Test
public void testGenerateDump(){
while(true){
byteArrayList.add(new byte[4096]);
}
}
}
修改JVM参数:
-Xmx500M
-Xms500M
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\test\dump\test.hprof
生成dump文件:
3.分析dump文件
将生成的test.hprof文件导入到MAT中:
导入后,强出上面的对话框:
Leak Suspects Report: 漏洞疑点报告,自动检查堆转储是否存在泄漏嫌疑,报告哪些对象被保存起来,为什么它们没有被垃圾收集;
Component Report: 元件报告,分析一组对象是否存在可疑的内存问题:重复的字符串、空集合、终结器、弱引用等
Re-open previously run reports: 打开以前的运行报告;
选择Leak Suspects Report,点击完成;
这里为我们生成了一份漏洞疑点报告;点击See stacktrace可以查看详细的栈信息:
从这里我们就可以确定问题所在处了,就是在testGenerateDump方法生成了大量Object[];
4.其它功能
分析dump文件会生成这么多的分析报告,我们一个一个的来了解它的作用;
4.1 Details
Size: 458.8 MB Classes: 974 Objects: 134.3k Class Loader: 4 Unreachable Objects Histogram
size:占用JVM内存大小;
Classes:类的个数;
Objects:对象个数;
4.2 Actions
4.2.1 Histogram(直方图): 列出每个类的实例数量;
Shallow Heap(浅堆):表示对象本身占用内存的大小,也就是对象头加成员变量(不是成员变量的值)的总和
Retained Heap(保留堆):如果一个对象被释放掉,那会因为该对象的释放而减少引用进而被释放的所有的对象(包括被递归释放的)所占用的heap大小,即对象被垃圾回收器回收后能被GC从内存中移除的所有对象之和。
4.2.2 Dominator Tree(支配树): 列出最大的对象及其保留的内容;
Shallow Heap(浅堆)、Retained Heap(保留堆)、Percentage(百分比) 是分析出哪个对象出问题的重要参考指标;
4.2.3 Top Consumers(顶级消费者): 打印按类和包分组的最昂贵的对象;
4.2.4 Duplicate Classes(重复类): 检测由多个类加载器加载的类;
4.3 Reports(报告)
4.3.1 Leak Suspects(泄漏嫌疑对象): 就是我们上面4.3看到的内容;
4.3.2 Top Components(顶级组件): 列出大于总堆1%的组件的报告;
5.总结
本文就到这里了,后面如果我学到了其它NB的功能,再补功能;