jmap -dump:format=b,file=xxx.hprof 是唯一生成 MAT/VisualVM 可加载的二进制 HPROF 堆快照的方式;漏掉 format=b、误用 -heap 或参数错误均无法生成有效 dump 文件。

jmap -dump:format=b,file=xxx.hprof 是唯一能生成可被 MAT、VisualVM 正确加载的堆快照的方式。其他参数组合(比如漏掉 format=b 或只用 -heap)只会输出摘要或报错,不产生可用 dump 文件。
怎么确认 Java 进程 PID 并避免权限失败
先用 jps -l 查进程,比 ps aux | grep java 更准——它直接过滤出 Java 类型进程,不会误抓 shell 脚本里的 java 字符串。如果 jps 找不到目标进程,说明:
- 目标 JVM 启动时加了 -XX:+DisableAttachMechanism,jmap 将彻底失效;
- 当前用户不是启动该 Java 进程的用户,且没 root 权限,jmap 会静默失败(不报错但无文件生成);
- 进程已 OOM 退出,只剩 zombie 状态,jmap 无法 attach。
jmap -dump 必须带的参数和常见错误
正确命令是:jmap -dump:live,format=b,file=/tmp/heap.hprof 12345。其中:
- live 表示只 dump 存活对象,能显著减小文件体积,但会触发一次 Full GC(STW 时间变长);
- 不加 live 会 dump 所有对象(包括待回收的),文件更大,但 STW 时间略短;
- 漏掉 format=b,jmap 默认输出文本格式,MAT 打不开,报错类似 Invalid HPROF file: unknown format version;
- 把 file= 写成 filename= 或路径不存在、无写权限,jmap 会静默失败,不提示错误。
生产环境执行前必须检查的三件事
在关键服务上跑 jmap -dump 前,务必确认:
- 堆大小是否超过 2GB:4GB 堆可能造成 3–5 秒 STW,用户请求会卡住;
- /tmp 或指定路径所在磁盘剩余空间是否 ≥ 堆大小的 90%(.hprof 文件接近实际堆占用);
- JDK 和后续分析工具版本是否匹配:JDK 17+ 生成的 dump,MAT 1.12 及更早版本大概率打不开,需升级到 MAT 1.13+。
OOM 后根本来不及手动 dump?那就别等
线上服务一旦 OOM 就崩溃退出,jmap 连 attach 的机会都没有。必须提前加 JVM 参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dumps/oom_%p.hprof
注意:
- /data/dumps/ 目录要提前 mkdir -p 并 chown 给 JVM 用户;
- %p 会被替换成 PID,防止多实例覆盖;
- 这个参数对 java.lang.OutOfMemoryError: Metaspace 无效,Metaspace OOM 需单独配 -XX:MaxMetaspaceSize + 监控。
实际最常踩的坑不是命令写错,而是以为 jmap 成功运行了——结果发现文件是空的、只有几 KB,或者 MAT 打开后显示 “No heap dumps found”。这时候第一反应不该是重试,而是立刻检查权限、路径、JDK 版本这三项。


















