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 |
获取堆转储(再给 MAT 打开)
常见方式(任选其一):
# JDK:导出堆(与 jmap -dump 等价思路)
jcmd <pid> GC.heap_dump /tmp/heap.hprof# JVM 参数:OOM 时自动 dump(生产常开)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprofSpring 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
结合 线程局部变量 里挂靠的大对象,定位「在某请求栈帧里攥着大集合」之类问题。
推荐分析流程(简版)
- 打开 dump,看 MAT 首页 Overview 的堆大小、类数量与大类提示。
- 跑 Leak Suspects,记疑点类名或包前缀。
- Histogram:按 Retained Heap 或按你的业务类过滤排序。
- 对嫌疑类 List objects → with incoming references 或 Merge Shortest Paths to GC Roots,追到 真正 GCRoot(静态字段、Thread、ClassLoader、JNI 等)。
- 对照代码:缓存上限、单例、注册/反注册、关闭钩子、线程池任务是否长期持有上下文等。
- 若有 两次 dump,可用 Compare Basket(或导出报告对比)看对象数增量(需 MAT 版本支持相应功能)。
与 JProfiler 的简单分工
| MAT | JProfiler | |
|---|---|---|
| 输入 | 离线 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]]