JVM监控及诊断工具---MAT

MAT (Java堆内存分析器,用于查找内存泄漏和查看内存消耗情况,可快速生成内存泄漏报表,对于堆内存的分析较Visual VM更强大

点击MemoryAnalyze.exe打开

JVM监控及诊断工具---MAT_第1张图片 JVM监控及诊断工具---MAT_第2张图片

生成堆快照文件(File->Acquire Heap Dump) 

JVM监控及诊断工具---MAT_第3张图片

读取堆快照文件(File->Open Heap Dump)

JVM监控及诊断工具---MAT_第4张图片

1. 浅堆与深堆

Shallow Heap(浅堆):指一个对象所占用的内存,包含对象引用、对象头、数据类型。(字节大小需向8字节对齐,即需补为能被8整除)

Retained Heap(深堆): 对象的保留集中所有对象的浅堆大小之和。保留集指只能通过该对象直接或间接访问到的所有对象的集合。

JVM监控及诊断工具---MAT_第5张图片

 示例

 创建3个学生对象(根据能否被3或5或7整除来访问WebPage对象), 其浅堆都为24

(4(int数据类型)+4 (String引用)+4(WebPage引用)+8(对象头)-> 24(20,向8对齐))

JVM监控及诊断工具---MAT_第6张图片

JVM监控及诊断工具---MAT_第7张图片

3个学生对象,深堆各不相同,以第3个学生对象为例,其访问了15个WebPage对象,但有7个WebPage对象可被其他学生对象调用,故只有8个WebPage对象可直接被回收。

elementData深堆之和字节数为1288:

【普通对象头(12) + 数组长度(4)】 + 数组内容【15个Obejct引用=16*4】 = 76,8字节对齐=80字节

15个Object分为13个152字节+2个144字节,总大小为=2264字节

7号和其他student重复的有0、21、42、63、84、35、70总计6个152和1一个144

2264 - 6 * 152 - 144 = 1208字节

ElementData本身的浅堆80 + 1208 = 1288字节

JVM监控及诊断工具---MAT_第8张图片

2. 支配数

MAT提供一种称为支配数(dominator_tree)的对象图,体现对象实例间的支配关系。在对象引用图中,所有指向对象B的路径都经过对象A,则认为对象A支配对象B。如果对象A是离对象B最近的一个支配对象,则认为对象A为对象B的直接支配者。

性质:

1. 对象A的子树(所有被对象A支配的对象集合)表示对象A的保留集,即深堆。

2. 如果对象A支配对象B,那么对象A的直接支配者也支配B

3. 支配树的边与对象引用图的边不直接对应

左图为对象引用图,右图为支配树

JVM监控及诊断工具---MAT_第9张图片

 示例: 以上面创建的第三个学生对象为例,只能通过该对象直接或间接访问到的所有对象的集合为8即保留集也即该对象的子树。

JVM监控及诊断工具---MAT_第10张图片

3. 支持OQL

MAT支持一种类似于SQL的查询语言OQL (Object Query Language)。OQL使用类SQL语法,可以在堆中进行对象的查找和筛选。

(点击F5执行语句)

JVM监控及诊断工具---MAT_第11张图片

 select * from java.lang.Object  

JVM监控及诊断工具---MAT_第12张图片

  select as retained set * from java.lang.Class (查询保留集)

JVM监控及诊断工具---MAT_第13张图片

你可能感兴趣的:(JVM,java,eclipse)