MAT(Memory Analyzer Tool)

Eclipse MAT(Memory Analyzer Tool)是开源的 Java 堆转储(heap dump)分析器,专门用来打开 .hprof / .phd 等快照,从对象占用、支配树、可疑泄漏等维度排查 OOM、内存疯涨、疑似泄漏。与 JProfiler 这类「带 CPU + 内存的一体化 Profiler」不同,MAT 更侧重 离线深度看堆;与 jcmd / jmap 的关系是:后者产 dump,MAT 读 dump


适用场景

场景说明
OutOfMemoryError: Java heap space已有或自动生成的 heap dump,查大户与引用链
老年代/堆曲线单调涨对比多次 dump 或看 Dominator / Histogram
怀疑缓存、静态集合、监听器未释放按类名、包路径抓 Retained Heap
Spring / 容器环境配合 Actuator heapdump 或 Pod 里 jcmd … GC.heap_dump

延伸阅读:垃圾回收JVM 中的堆与 OOM 参数。


获取堆转储(再给 MAT 打开)

常见方式(任选其一):

# JDK:导出堆(与 jmap -dump 等价思路)
jcmd <pid> GC.heap_dump /tmp/heap.hprof
# JVM 参数:OOM 时自动 dump(生产常开)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof

Spring Boot:可通过 /actuator/heapdump(需暴露端点并做好权限)下载快照(见 Actuator 监控)。

注意:大堆 dump 体积极大、耗时且会 Stop-The-World,尽量在可控窗口或副本环境采集。


安装

  • 官方发布页:Eclipse Memory Analyzer(独立 RCP 或 Eclipse 插件)。
  • 打开 MAT → File → Open Heap Dump,选择 .hprof;首次解析会建索引,大文件需等待。

核心视图(查 dump 时最关心这些)

Histogram(类级别直方图)

统计实例数与 Shallow Heap(对象自身大小)。先找 实例数异常多合计占用大 的类,再右键 Merge Shortest Paths to GC Roots 看为何没被回收。

Dominator Tree(支配树)

谁「占住」了最多堆Retained Heap 大的支配对象往往是释放整坨内存的关键。适合找「一个大 Map / 一个大 List 引用了一片图」这类结构。

Leak Suspects Report(泄漏疑点报告)

向导生成的 疑似泄漏报告,适合快速浏览;最终仍需用 Histogram / Dominator / GC Roots 路径 人工确认(误报常见)。

Thread Overview / Stack

结合 线程局部变量 里挂靠的大对象,定位「在某请求栈帧里攥着大集合」之类问题。


推荐分析流程(简版)

  1. 打开 dump,看 MAT 首页 Overview 的堆大小、类数量与大类提示。
  2. Leak Suspects,记疑点类名或包前缀。
  3. Histogram:按 Retained Heap 或按你的业务类过滤排序。
  4. 对嫌疑类 List objects → with incoming referencesMerge Shortest Paths to GC Roots,追到 真正 GCRoot(静态字段、Thread、ClassLoader、JNI 等)。
  5. 对照代码:缓存上限、单例、注册/反注册、关闭钩子、线程池任务是否长期持有上下文等。
  6. 若有 两次 dump,可用 Compare Basket(或导出报告对比)看对象数增量(需 MAT 版本支持相应功能)。

JProfiler 的简单分工

MATJProfiler
输入离线 heap dump可 live 也可快照
强项支配树、GC Roots、大堆离线刨根CPU + 内存一体、attach 在线
典型用法生产 OOM 后的 hprof预发/本地性能与分配热点

常见问题

  • 打不开 / 解析失败:确认 dump 与 JVM 大版本匹配方式是否异常;极端损坏的 dump 需重采。
  • MAT 内存不够:在 MemoryAnalyzer.ini 中调大 -Xmx(64 位、本机 RAM 允许的前提下)。
  • 只看到 Native 增长:MAT 主要分析 Java 堆;堆外、元空间需结合 NMT、操作系统工具等(见 jcmd、各监控文档)。

参考链接

  • Eclipse MAT 文档与下载
  • 堆参数与 dump:[[编程语言/Java/Java基础/JVM|JVM]][[编程语言/Java/Java基础/垃圾回收|垃圾回收]]
  • 命令行导出:[[编程语言/Java/JDK工具/jcmd|jcmd]]