MAT 工具使用

MemoryAnalyzer 工具常见使用方法

菜单介绍

名称 作用
Histogram 按java类型列出所有类的浅层大小和深层大小
Dominator Tree 按大对象排序列出浅层大小和深层大小
Leak Suspects 泄露报告,给出几个大对象,仅供参考

类大小

两种计算方式

shallow Heap :对象自身大小

retained heap:对象自身以及所有引用的属性对象大小

分析思路

  1. 根据泄露报告给出的大对象,排查调用链路,定位到具体的大对象

  2. 例如 Java.lang.string 0x6c40d8f98

  3. 分析对象生成的代码路径

  4. 分析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

  1. 分析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

  2. 一般先看outgoing 树状图,确定一个具体的,非java原生类

    例如 org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport

    然后 结合这个类的源码,对照 outgoing 树状图

    查看里面大对象属性,是怎么构造出来的

    例如:属性 stringbuilder,是由 执行 appender.append(message) 方法时,新建生成的

    在方法未执行完时,就会由message 、stringbuilder 两个字符串变量,导致内存占用较多

    此时一般就确定oom 发生的场景了

    导出

    表格都可以在右上角找到导出为csv、html等按钮