MAT使用总结
最近在做项目的时候遇到一个内存泄漏,最后通过MAT定位了问题, 先介绍一下MAT的一些基本概念:
Shallow Heap:对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和
Retained Heap:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。
直接上图..
1. 生成用于内存分析的dump文件
(1)在tomcat的启动脚本里直接配置jconsole的监控用端口:
-Dcom.sun.management.jmxremote.port=10010 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.1.1.1
(2) 使用jvisualvm连接tomcat实例,并导出dump文件
(3) 下载到本地并用MAT打开,直接默认并点击finish
(4) MAT自动分析得出一个可能的内存泄漏的地方,通过此处我们已经基本可以知道是那个类的问题了...
(5)点击details,查看详细:
此处会有4部分:
Shortest Paths To the Accumulation Point
GC root到聚集点的最短路径,就是持有可能泄漏内存对象的最近一层
Accumulated Objects in Dominator Tree
对象聚集详情,这个地方我们经常用来看完整的reference chain
Accumulated Objects by Class in Dominator Tree
这里能找到被聚集的对象实例的类名,可以看到某个类被实例化多少次
All Accumulated Objects by Class
这个好像比第三个更细 具体到类的属性了
查看Accumulated Objects in Dominator Tree详情,可以看到java.util.concurrent.LinkedBlockingQueue类的对象占用了MAT检测到的可能泄漏的内存
点击这个Class,查看持有这些Object的Class:
因此我们可以知道是这两个类持有了 java.util.concurrent.LinkedBlockingQueue对象,注意:下图从上往下是层层引用关系
至此内存泄漏问题定位结束.
参考:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html