MAT内存分析工具的使用

Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,运行报告以自动提取泄漏嫌疑者。下面来介绍下MAT工具如何使用。

获取Heap Dump文件

  • 通过OOM获取,即在OutOfMemoryError后获取一份HPROF二进制Heap Dump文件,可以在jvm里添加参数:

    -XX:+HeapDumpOnOutOfMemoryError

  • 主动获取,即在虚拟机添加参数如下,然后在Ctrl+Break组合键即可获取一份Heap Dump

    -XX:+HeapDumpOnCtrlBreak

  • 使用HPROF agent

    使用Agent可以在程序执行结束时或受到SIGOUT信号时生成Dump文件。配置在虚拟机的参数如下:

    -agentlib:hprof=heap=dump,format=b

  • jmap 可以在cmd里执行,命令如下:

    jmap -dump:format=b,file=<文件名XX.hprof> <pid>

  • 使用JConsole

  • 使用Memory Analyzer Tools的File —> Acquire Heap Dump功能

    image-20201202132826161

导入Head Dump文件

一般选择 Leak Suspects Report。

image-20201202133007191

image-20201202133226989

MAT常用操作

Histogram是我们使用最多的一个,可以列出内存中的对象,对象的个数及其大小

  1. Class Name : 类名称,java类名
  2. Objects : 类的对象的数量,这个对象被创建了多少个
  3. Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用
  4. Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和

image-20201202133436657

右键某个类可以查看某个类被哪些类引用了,以及引用了哪些类。

with outgoing references,查看该类内部引用了哪些类

with incoming references,查看该类被哪些类引用了

image-20201202133619353

快速找到某个实例没被释放的原因。

image-20201202133831662

Dominator Tree

列出线程的树结构,及线程下面对象占用内存的空间

Top Comsumers

通过图型列出最大的Object

参考

  1. 10 Tips for using the Eclipse Memory Analyzer - EclipseSource
  2. JVM 内存分析神器 MAT: Incoming Vs Outgoing References 你真的了解吗? - 云+社区 - 腾讯云 (tencent.com)
  3. MemoryAnalyzer - Eclipsepedia
  4. 项目demo monitor-tunning
  5. MAT入门到精通(一) (qq.com)
显示评论