MAT内存泄露分析实战
所属分类 MAT
浏览量 1599
写一个最简单的内存泄露的例子
抓取 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简介