MAT 工具使用
MemoryAnalyzer 工具常见使用方法
菜单介绍
| 名称 | 作用 |
|---|---|
| Histogram | 按java类型列出所有类的浅层大小和深层大小 |
| Dominator Tree | 按大对象排序列出浅层大小和深层大小 |
| Leak Suspects | 泄露报告,给出几个大对象,仅供参考 |
类大小
两种计算方式
shallow Heap :对象自身大小
retained heap:对象自身以及所有引用的属性对象大小
分析思路
根据泄露报告给出的大对象,排查调用链路,定位到具体的大对象
例如 Java.lang.string 0x6c40d8f98
分析对象生成的代码路径
分析1:
使用 income reference,会形成树状图,从根向子节点,分别为 内->外层的调用关系
一般用于查看大对象被哪些类包装了
例如 java.lang.String 被HashMap引用
HashMap被 java.util.jar.Manifest 引用
java.lang.String @ 0x6c40d8f98
‘- key java.util.HashMap$Node @ 0x6c40d8f78 | 32 | 2,520
‘- [5989] java.util.HashMap$Node[8192] @ 0x6c3edeeb0 | 32,784 | 2,062,104
‘- table java.util.HashMap @ 0x6c3ea8c58 | 48 | 2,062,152
‘- entries java.util.jar.Manifest @ 0x6c3ea7cd0 | 24 | 2,205,568
‘- referent java.lang.ref.SoftReference @ 0x6c3ea7ca8 | 40 | 2,205,608
‘- manRef java.util.jar.JarFile @ 0x6c357a650 | 64 | 3,189,208
|- referent java.lang.ref.Finalizer @ 0x6c33e54e8 | 40 | 40
|- jar sun.misc.URLClassPath$JarLoader @ 0x6c357a4f0 | 56 | 352
分析2
使用 outgoing reference,会形成树状图,从根向子节点,分别为 外->内 层的调用关系
一般用于查看大对象的剥离
例如 JarFile 引用了 String 、ZipCoder 等
java.util.jar.JarFile @ 0x6c357a650 | 64 | 3,189,208
class java.util.jar.JarFile @ 0x6c3200ff0 System Class | 32 | 2,200
|- name java.lang.String @ 0x6c357a690 F:.m2\org\eclipse\collections\eclipse-collections\10.4.0\eclipse-collections-10.4.0.jar| 24 | 216
|- zc java.util.zip.ZipCoder @ 0x6c357a768 | 32 | 152
|- streams java.util.WeakHashMap @ 0x6c357a800 | 48 | 176
|- inflaterCache java.util.ArrayDeque @ 0x6c357a8b0 | 24 | 104
|- manEntry java.util.jar.JarFile$JarFileEntry @ 0x6c357a960 | 96 | 176
|- manRef java.lang.ref.SoftReference @ 0x6c3ea7ca8 | 40 | 2,205,608一般先看outgoing 树状图,确定一个具体的,非java原生类
例如 org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport
然后 结合这个类的源码,对照 outgoing 树状图
查看里面大对象属性,是怎么构造出来的
例如:属性 stringbuilder,是由 执行 appender.append(message) 方法时,新建生成的
在方法未执行完时,就会由message 、stringbuilder 两个字符串变量,导致内存占用较多
此时一般就确定oom 发生的场景了
导出
表格都可以在右上角找到导出为csv、html等按钮