MAT排查堆溢出

发现Java应用程序占用的内存出现了泄露的迹象,那么我们一般采用下面的步骤分析:
1. 用工具生成java应用程序的heap dump(如jmap)
2. 使用Java heap分析工具(如MAT),找出内存占用超出预期的嫌疑对象
3. 根据情况,分析嫌疑对象和其他对象的引用关系。
4. 分析程序的源代码,找出嫌疑对象数量过多的原因。

 

jmap是一个可以输出内存中所有对象的工具,可以将VM中的heap,以二进制输出成文本。jmap-dump:format=b,file=heap.bin 8120可以将8120进程的内存heap输出到heap.bin文件里。

jmap pid       #打印内存使用的摘要信息
jmap –heap pid      #java heap信息
jmap -histo:live pid     #统计对象count ,live表示在使用
jmap -histo pid >mem.txt    #打印比较简单的各个有多少个对象占了多少内存的信息,一般重定向的文件
jmap -dump:format=b,file=mem.bin pid    #将内存使用的详细情况输出到mem.dat 文件

 

从上图可以看到它的大部分功能。
1. Histogram可以列出内存中的对象,对象的个数以及大小。
2. Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
3.Top consumers通过图形列出最大的object。
4.Leak Suspects通过MA自动分析泄漏的原因。

Histogram如下图:
Objects:类的对象的数量。
Shallow size:对象本身占用内存的大小不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和
Retained size:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。

Dominator Tree如下图:

Top consumers如下图:
这里显示了内存中最大的对象有哪些,对应的类是哪些,类加载器classloader是哪些。

Leak Suspects如下图:

 

 

 

 

 



 

参考:

https://blog.csdn.net/sunhuaqiang1/article/details/54455106

https://blog.csdn.net/thjnemo/article/details/43059377

https://blog.csdn.net/alli0968/article/details/52460008

posted on 2018-10-18 20:39  溪水静幽  阅读(253)  评论(0)    收藏  举报