首页  

MAT内存泄露分析实战     所属分类 MAT 浏览量 1596
写一个最简单的内存泄露的例子
抓取 heap dump 然后使用 MAT分析

 获取jvm heap dump 的几种方式 


private static final int M1 = 1024 * 1024;
public static void main(String[] args) throws Exception {
		List list = new ArrayList();
		while (true) {
			try {
				list.add(new byte[M1]);
			} catch (Throwable e) {
				System.out.println(e + "," + LocalDateTime.now());
			}
			System.out.println(list.size() + "," + LocalDateTime.now());
			Thread.sleep(1000);
		}
	}
}

ps aux|grep MatTest
jmap -dump:live,format=b,file=mattest.dump 28834
打开 MAT 
file / open heap dump

Histogram: Lists number of instances per class
按 Retained Heap 倒排 
byte[]  使用内存最多
右键菜单 
list Objects / with incoming references
查看谁引用了这些类和对象
可逐级点开 ,显示 具体的引用关系 

byte[1048576] @ 0x7442e1248
    [66] java.lang.Object[73] @ 0x7438096c0 
        elementData java.util.ArrayList @ 0x743809980 
            java.lang.Thread @ 0x743809b80  main Thread
                [0] java.lang.Thread[4] @ 0x74394f1b0  

点击某个对象 可以 在 inspector 面板中 查看 对象的具体信息
statics  Attributions ClassHierarchy Value


使用 Dominator Tree

java.lang.Thread @ 0x743809b80  main Thread 
|- java.util.ArrayList @ 0x743809980    
|  '- java.lang.Object[73] @ 0x7438096c0 
|     |- byte[1048576] @ 0x740000b38
|     |- byte[1048576] @ 0x740100b48


可以根据对象地址定位到具体对象
然后  右键菜单 
list Objects / with incoming references
查看引用链   定位相关代码

上一篇     下一篇
Garbage Collection Roots

内存分析工具MAT中的重要概念

获取jvm heap dump 的几种方式

MAT内存分析之OQL

java.lang.ref包

http2.0简介