最稳妥方式是执行jmap -dump:format=b,file=/tmp/heap.hprof <pid>,需确保权限、路径、JVM未禁用Attach机制,并注意STW影响及MAT兼容性问题。

在 Java 中,jmap 是 JDK 自带的内存分析工具,可用于导出指定 Java 进程的堆内存快照(即 heap dump),生成的文件通常是 .hprof 格式,可被 VisualVM、JProfiler、Eclipse MAT 等工具打开分析。
确认目标 Java 进程 PID
导出前需知道目标进程的进程 ID(PID)。常用方式:
- 执行
jps -l查看当前用户所有 Java 进程及其主类或 JAR 路径 - 执行
ps aux | grep java(Linux/macOS)或tasklist | findstr java(Windows)辅助识别 - 注意区分多个 Java 进程,避免导错应用
使用 jmap 导出堆快照(推荐方式)
最常用且稳定的命令是:
jmap -dump:format=b,file=heap.hprof <pid>
立即学习“Java免费学习笔记(深入)”;
-
format=b表示二进制格式(必须,否则无法被主流工具识别) -
file=heap.hprof指定输出文件路径和名称,可写成绝对路径如/tmp/heap_2024.hprof - 执行后会暂停目标 JVM 短暂时间(尤其堆较大时),生产环境建议选低峰期操作
其他实用选项(按需选用)
如果只需要概要信息,或想减少影响,可先用以下命令探查:
-
jmap -heap <pid>:打印堆配置、使用量、GC 算法等摘要信息 -
jmap -histo <pid>:输出对象实例数量和内存占用直方图(不触发 full GC) - 加
:live参数强制只导存活对象(更准但会先触发一次 Full GC):jmap -dump:format=b,live,file=heap_live.hprof <pid>
注意事项与常见问题
导出过程可能失败,常见原因包括:
-
权限不足:Linux/macOS 下,jmap 必须由启动 Java 进程的同一用户运行;否则报
Unable to open socket file -
目标进程未启用 attach 功能:某些 JVM 启动参数(如
-XX:+DisableAttachMechanism)会禁用 jmap;JDK 8u191+ 默认限制 attach,可加-XX:+StartAttachListener启动时开启 -
容器环境(Docker/K8s):需确保容器内安装了 JDK(不只是 JRE),并挂载了
/proc和/sys(部分精简镜像默认未挂载)


















