介绍MAT的一些操作前先明确几个概念。
Shallow VS. Retained Heap
Shallow Heap是一个对象占用的堆内存。主要从以下几个值计算:一个引用占用4个字节或者8个字节(操作系统不一样决定)、一个int占用4个字节、一个long占用8个字节、一个shot占用2个字节、一个数组占用size * 每个元素占用字节… 这些是大概的估算,因为要考虑字节对齐。例如:public class A { private int dataA; private Object[] arrayInt = new Object[3]; }
A这个类的对象本身占用 4 + 4*3 = 12堆空间(假设不考虑字节对齐、引用占用4个字节)。
一个对象X的Retained Set是指因对象X被垃圾回收而被回收的对象集合。说白了就是这些对象只被对象X引用或者只被对象X间接引用。如下图描述了一些对象的引用关系
X的Retained Set是X、E、F和对象G;C、D不属于X的Retained Set因为C还被A引用,D还被C引用。
一个对象X的Retained Heap就是对象X以及X的Retained Set对象占用的堆空间。在上面例子中X、E、F和对象G占用的空间就是X的Retained Heap。
dominator tree(控制树)
对象X控制(dominates)对象Y是指从GC Root对象到达对象Y的所有路径一定经过对象X,对象X称为对象Y的控制者(dominator)。如果是对象X是距离对象Y最近的控制者,则称为immediate dominator。控制关系存在传递性,即如果X控制Y且Y控制Z,则X一定控制Z。
控制树(dominator tree)就是描述对象控制关系的树形图。X的控制子树实际上就是X的Retained Set。还是以上面的引用关系图为例。X的控制子树如下图:
X不是D和C的dominator,因为C、D有不经过X的路径到达,GC ROOT从A这条路径不经过X。
下节介绍MAT的histogram工具