前言
MAT是基于Eclipse的内存分析工具,MAT(Memory Analyer Tool),它是一个快速、功能丰富的Java Heap的分析工具,它可以帮助我们查找内存泄漏和排查问题,而且还有丰富的报表统计等等。我们可以通过插件的形式运行还可以单独下载,在前文中我们介绍了如何安装MAT工具,详情可以翻阅查看。
模拟OOM
我们前之前介绍了JDK命令工具来生成dump文件,如果是本地调试,我们可以参数来配置生成的目录。
-Xms10m -Xmx10m -Xmn8m -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=F:/heapdump.hprof
测试代码
// 测试代码
public static final int _MB = 1024 * 1024 ;
public static void main(String[] args) {
List<Sub> strs = new ArrayList<Sub>();
while( true ){
strs.add(new Sub(String.valueOf(5 *_MB)));
}
}
MAT打开快照文件
我们通过MAT工具打开File -> Open Heap Dump,打开生成的文件
MAT可疑点报表
打开之后就如下图所示,我们将其文件在MAT工具中打开。然后打开Leak Suspect(内存泄露可疑点)报表
点击完成之后,如下图所示,MAT会帮你分析出可疑的问题点所在
MAT堆栈信息
我们点击左上角的图标可以看到堆栈信息
通过MAT分析的堆栈信息,.我们可以清楚的看到那个方法,对象的占比
- Shallow Heap(浅堆)
表示该对象自身占用的堆内存,不包括它引用的对象。针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。
- Retained Heap(深堆)
表示当前对象大小+当前对象可直接或间接引用到的对象的大小总和。换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。不过,释放的时候还要排除被GC Roots直接或间接引用的对象。
MAT堆栈详情
我们也可以查看下详情
我们也可以在主视图面板中点击Histogram
1). Histogram可以列出内存中的对象,对象的个数以及大小。
2). Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
3).Top consumers通过图形列出最大的object。
4).Leak Suspects通过MA自动分析泄漏的原因。
MAT条件筛选
可以看出来那个对象占用了多大的内存还有实例的数量
GCRoots
MAT溢出源
Exclude all phantom/weak/soft etc. reference 意思是排除虚引用、弱引用和软引用,即只剩下强引用,因为除了强引用之外,其他的引用都可以被JVM GC掉,如果一个对象始终无法被GC,就说明有强引用存在,从而导致在GC的过程中一直得不到回收,最终就内存溢出了。
还可以点击支配树视图, 在此视图中列出了每个对象(Object Instance)与其引用关系的树状结构
我们可以看到同时包含了占用内存的大小和百分比。这个对象占用了95.08%肯定是不正常的。