MAT MemoryAnalyzer中文使用指南

由于前段时间生产遇到JVM问题,需要分析dump文件,如果对相关分析工具没有使用过的小伙伴来说可能懵圈,这里介绍一下MAT工具排查问题的使用方法;

1.MAT安装

没有安装过的小伙伴先点 这里 进行下载;解压之后包含以下文件:
MAT MemoryAnalyzer中文使用指南_第1张图片
打开MemoryAnalyzer.ini,修改JVM堆参数(注意:修改堆大小需要超过你分析的hprof 文件的大小,我这里做教程就定义为1024M):
MAT MemoryAnalyzer中文使用指南_第2张图片
配置完成后,点击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文件:
MAT MemoryAnalyzer中文使用指南_第3张图片

3.分析dump文件

将生成的test.hprof文件导入到MAT中:
MAT MemoryAnalyzer中文使用指南_第4张图片
导入后,强出上面的对话框:
Leak Suspects Report: 漏洞疑点报告,自动检查堆转储是否存在泄漏嫌疑,报告哪些对象被保存起来,为什么它们没有被垃圾收集;
Component Report: 元件报告,分析一组对象是否存在可疑的内存问题:重复的字符串、空集合、终结器、弱引用等
Re-open previously run reports: 打开以前的运行报告;

选择Leak Suspects Report,点击完成;
MAT MemoryAnalyzer中文使用指南_第5张图片
这里为我们生成了一份漏洞疑点报告;点击See stacktrace可以查看详细的栈信息:
MAT MemoryAnalyzer中文使用指南_第6张图片
从这里我们就可以确定问题所在处了,就是在testGenerateDump方法生成了大量Object[];

4.其它功能

MAT MemoryAnalyzer中文使用指南_第7张图片
分析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(直方图): 列出每个类的实例数量;
MAT MemoryAnalyzer中文使用指南_第8张图片

Shallow Heap(浅堆):表示对象本身占用内存的大小,也就是对象头加成员变量(不是成员变量的值)的总和
Retained Heap(保留堆):如果一个对象被释放掉,那会因为该对象的释放而减少引用进而被释放的所有的对象(包括被递归释放的)所占用的heap大小,即对象被垃圾回收器回收后能被GC从内存中移除的所有对象之和。

4.2.2 Dominator Tree(支配树): 列出最大的对象及其保留的内容;
MAT MemoryAnalyzer中文使用指南_第9张图片

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的功能,再补功能;

你可能感兴趣的:(jvm,jvm,内存泄漏,java)