简介
以下译于官网:
Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑者。
下载地址
https://www.eclipse.org/mat/downloads.php
最近公司的监控系统PinPoint一直在提示我们系统存在大量的Full GC问题,导致内存泄漏。
Heap Dump
首先了解下Heap Dump,它也叫堆转储文件,是java进程在某个时间内的快照。它在触发快照的时候保存了很多信息:java对象和类信息。通常在写Heap Dump文件前会触发一次Full GC。
Heap Dump信息:
Typical information which can be found in heap dumps (once more - depending on the heap dump type) is:
All Objects
Class, fields, primitive values and references
All Classes
Classloader, name, super class, static fields
Garbage Collection Roots
Objects defined to be reachable by the JVM
Thread Stacks and Local Variables
The call-stacks of threads at the moment of the snapshot, and per-frame information about local objects
怎样获取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功能
MAT 用来做什么
- 找出内存泄漏的原因
- 找出重复引用的类和jar
- 分析集合的使用
- 分析类加载器
MAT使用介绍
Histogram是我们使用最多的一个,可以列出内存中的对象,对象的个数及其大小
- Class Name : 类名称,java类名
- Objects : 类的对象的数量,这个对象被创建了多少个
- Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
- Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和
在某一项上右键打开菜单选择 list objects ->with incoming refs 将列出该类的实例
快速找出某个实例没被释放的原因,可以右健 Path to GC Roots–>exclue all phantom/weak/soft etc. reference :
用这个方法可以快速找到某个对象的 GC Root,一个存在 GC Root的对象是不会被 GC回收掉的.
深色区域被怀疑有内存泄漏,具体点开详情来找到类