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如下图:

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
浙公网安备 33010602011771号