Eclipse Memory Analyzer(MAT)是Java内存泄漏排查核心工具,关键在于获取高质量堆转储(jmap或OOM自动触发)、优先查看Leak Suspects报告定位高Retained Heap对象、结合Histogram与Dominator Tree分析实例数和引用链,并用OQL精准验证泄漏假设。

Java内存泄漏排查用Eclipse Memory Analyzer(MAT)分析堆转储,核心是“获取有效快照 + 看懂关键视图 + 追查引用链”。重点不在工具操作多复杂,而在于理解哪些线索指向泄漏——比如老年代持续增长、GC后内存不回落、某个类实例数异常飙升。
生成高质量堆转储文件
堆转储质量直接影响分析结果。生产环境建议两种方式结合:
- 主动触发:用 jmap -dump:format=b,file=heap.hprof <pid> 抓取当前内存快照。适合已发现内存缓慢上涨但尚未OOM时。
- 自动捕获:JVM启动参数加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dumps/。OOM发生时自动生成,保留最接近崩溃时刻的状态。
- 避免在高负载时频繁 dump,可能引发STW(Stop-The-World);大堆(>4GB)建议用 -XX:+UseG1GC 配合,减少dump耗时。
用MAT打开并初步识别泄漏嫌疑
MAT加载 .hprof 文件后会自动索引,几秒到几分钟(取决于文件大小)。首次加载完成,优先看右上角的 Leak Suspects Report:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 它不是万能诊断,但能快速标出前1–3个最可疑的内存占用大户,比如“2个HashMap占用了78%的Retained Heap”。
- 点击报告中的“Details”链接,会跳转到对应对象的支配树(Dominator Tree),显示该对象及其所有被它强引用的对象集合。
- 若报告提示“no leaks found”,不代表没有问题,可能是泄漏对象未达阈值,或引用链太深,需手动深入。
通过支配树和直方图定位根因
Leak Suspects没结论时,转向两个核心视图:
立即学习“Java免费学习笔记(深入)”;
- Histogram(直方图):按类名分组统计实例数与Retained Heap。排序后重点关注“实例数极大”或“Retained Heap极高”的类,比如 com.example.cache.DataCacheEntry 占了5.2GB且有120万实例——明显异常。
- Dominator Tree(支配树):按Retained Heap降序排列,每个节点代表一个“支配者”对象(即删除它,其支配的所有对象才可能被回收)。找到顶部几个大节点,右键 → “Path to GC Roots” → 勾选“exclude weak/soft references”,查看谁在强持有它。
- 常见泄漏模式:静态集合(static Map)、未注销的监听器、ThreadLocal未清理、缓存未设过期策略、数据库连接/流未关闭等。
用OQL验证和缩小范围
当怀疑某类对象泄漏但数量太多时,可用对象查询语言(OQL)精准筛选:
- 例如查所有未被GC Roots直接引用的 String 实例:SELECT * FROM java.lang.String s WHERE s.@GCRoot = false
- 查某个缓存Map中key为特定类型的条目:SELECT m FROM java.util.HashMap m WHERE m.table.@length > 10000
- OQL支持正则、聚合、关联查询,比手动展开更高效,适合二次验证假设。

















