Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑者。下面来介绍下MAT工具如何使用。
获取Heap Dump文件
通过OOM获取,即在OutOfMemoryError后获取一份HPROF二进制Heap Dump文件,可以在jvm里添加参数:
-XX:+HeapDumpOnOutOfMemoryError
主动获取,即在虚拟机添加参数如下,然后在Ctrl+Break组合键即可获取一份Heap Dump
-XX:+HeapDumpOnCtrlBreak
使用HPROF agent
使用Agent可以在程序执行结束时或受到SIGOUT信号时生成Dump文件。配置在虚拟机的参数如下:
-agentlib:hprof=heap=dump,format=b
jmap 可以在cmd里执行,命令如下:
jmap -dump:format=b,file=<文件名XX.hprof> <pid>
使用JConsole
使用Memory Analyzer Tools的File —> Acquire Heap Dump功能
导入Head Dump文件
一般选择 Leak Suspects Report。
MAT常用操作
Histogram是我们使用最多的一个,可以列出内存中的对象,对象的个数及其大小
- Class Name : 类名称,java类名
- Objects : 类的对象的数量,这个对象被创建了多少个
- Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
- Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和
右键某个类可以查看某个类被哪些类引用了,以及引用了哪些类。
with outgoing references,查看该类内部引用了哪些类
with incoming references,查看该类被哪些类引用了
快速找到某个实例没被释放的原因。
Dominator Tree
列出线程的树结构,及线程下面对象占用内存的空间
Top Comsumers
通过图型列出最大的Object