MAT(Memory Analyzer Tool),是一款快速便捷且功能强大丰富的JVM堆内存离线分析工具。其通过展现JVM异常时所记录的运行时堆转储快照(heap dump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。
MAT主要适用场景:
-
内存溢出, JVM堆区放不下存活及待申请的对象。如:高峰期系统出现OOM异常,需定位内存瓶颈点来指导优化。
-
内存泄漏,不会再使用的对象无法被垃圾回收器回收。如:系统运行一段时间后出现Full GC,直到周期性OOM,最终需人工重启解决。
-
内存占用高,内存占用高,影响服务实时性、稳定性、吞吐能力。
-
CPU高,频繁GC引起CPU极高。
-
业务对象分析,比如会话数量分析、大对象分析、循环过多分析等等。
Heap Dump
Heap Dump是Java进程堆内存再一个时间点的快照,通常情况下,快照会包含关于堆中Java对象和类的信息,这些信息是再生成快照时的,所以堆是具有时效性,不同时刻获取的堆内容一般不相同,主要内容如下:
-
所有对象的实例信息:对象所属类名、基础类型和引用类型的属性等;
-
所有类信息:类加载器、类名、继承关系、静态属性等;
-
GC Roots:GC Roots代表通过可达性分析来判断JVM对象是否存活的起始集合;
-
线程栈及局部变量:快照生成时刻的所有线程的线程栈帧,以及每个线程栈的局部变量。
Shallow Heap
Shallow Heap代表一个对象结构自身所占用的内存大小,如java.util.ArrayList对象的Shallow Heap包含8字节的对象头、8字节的对象数组属性elementData引用、4字节的size属性、4字节的modcount属性,Shallow Heap又叫浅堆。
Retained Set
对象retained set,是指该对象被GC回收后,所有能被回收的对象集合;另外,当该对象无法被GC回收,则其retained set也必须无法被GC回收。
Retained Heap
Retained Heap是一个对象被GC回收后,可释放的内存大小,等于释放对象的Retained Set中所有对象的Shallow Heap的和,Retained Heap又叫深堆。
Dominator Tree
如果所有指向对象Y的路径都经过对象X,则X支配Y。 Dominator Tree是根据对象引用及支配关系生成的整体树状图,支配树清晰描述了对象间的依赖关系,如下图,左边是引用关系,右边是支配树。

OQL
OQL是类似于SQL的MAT专用统一语言,可以根据复杂的查询条件对dump文件中的类或者对象等数据进行筛选。
References
包含outgoing references、incoming references,均反映了对象间直接依赖关系。
-
outgoing references:对象引用的外部对象(注意不包含对象的基本类型属性)
-
incoming references:直接引用了当前对象的对象,每个对象的incoming references可能有1到多个。
MAT通用设置
mat自身默认内存为1024M,
mat的默认文件结构

MemoryAnalyzer.ini文件

MAT的主要功能
(1)全局信息
(2)统计Histogram
(3)支配树
(4)OQL查询
(5)线程信息
(6)堆预览、泄漏分析、大对象分析、报告分析
(7)引用关系、GC Roots、Java基础、Java集合等等。