最稳妥导出方式是jmap -dump:format=b,file=/tmp/heap.hprof ,需确保权限、路径有效、jvm未禁用attach机制,并注意stw影响及mat兼容性;oom时可启用-xx:+heapdumponoutofmemoryerror自动捕获。

Java 内存快照(Heap Dump)导出和分析是排查内存泄漏、对象堆积、OOM 等问题的核心手段。关键在于:选对时机导出、用合适工具打开、聚焦可疑对象链路。
一、如何导出内存快照(Heap Dump)
常用方式有三类,按场景选择:
-
运行中主动触发:使用
jmap命令(JDK 自带),适合可控环境jmap -dump:format=b,file=heap.hprof <pid></pid>
若提示“Unable to open socket file”,可尝试加-F强制(可能暂停应用几秒):jmap -F -dump:format=b,file=heap.hprof <pid></pid> -
发生 OOM 时自动生成:启动 JVM 时添加参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/
这样在抛出java.lang.OutOfMemoryError时会自动保存快照,非常实用。 -
通过 JMX 或管理接口触发:如 Spring Boot Actuator 的
/actuator/heapdump端点(需启用并配置安全策略),返回 HPROF 文件流,适合容器化或远程环境。
二、主流分析工具及入门操作
推荐两个轻量高效、无需安装的工具:
-
Eclipse Memory Analyzer(MAT):最成熟开源工具,界面清晰,分析能力强。
下载地址:https://www.eclipse.org/mat/downloads.php
打开方式:启动 MAT → “Open Heap Dump” → 选择 .hprof 文件 → 等待解析完成(大文件需耐心)
关键视图:
• Leak Suspects Report:首页自动生成疑似泄漏报告,优先看
• Dominator Tree:按“支配对象大小”排序,找占用内存最大的对象及其引用链
• Histogram:统计各类对象实例数,配合右键 “Merge Shortest Paths to GC Roots” 查谁在强引用它 -
JDK 自带 jvisualvm(含 VisualGC 插件):JDK 8 及以前默认自带;JDK 9+ 需单独下载 VisualVM。
加载快照后,切换到 “Classes” 或 “Instances” 标签,可排序、过滤、查看对象引用关系,适合快速概览。
三、分析时重点关注什么
别陷入全量数据,盯住三类线索:
-
对象数量异常多:比如
byte[]、char[]、String、自定义缓存类(如CacheEntry)实例数达几十万以上 - 单个对象或类型占用堆比例高:MAT 中 Dominator Tree 里前几位占总堆 20%+,尤其非基础类
-
GC Roots 不合理持有:例如静态集合(
static Map)、线程局部变量(ThreadLocal)、未注销的监听器,导致本该回收的对象一直存活
四、小技巧与避坑提醒
实际操作中容易卡住的点:
- 快照文件太大(>2GB)打不开?→ 用 MAT 的“Parse heap dump in background”选项,或先用
jmap -histo <pid></pid>快速看对象分布 - MAT 报 “Not a valid HPROF file”?→ 检查是否用了
jmap -dump:live(只导存活对象),或确认文件传输没损坏(对比 md5) - 生产环境不敢轻易
jmap?→ 改用jcmd <pid> VM.native_memory summary</pid>辅助判断是否真为堆内问题,或部署前开启-XX:+HeapDumpOnOutOfMemoryError
导出和分析本身不复杂,但需要结合代码逻辑判断“为什么这个对象不该存在这么久”。多练几次,看懂 GC Roots 和支配树,就能准确定位大多数内存问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











