jmap -dump:format=b,file=xxx.hprof 可生成MAT等工具支持的二进制堆转储文件,加-F强制执行需权限;注意JDK与分析工具版本兼容性,避免生产环境高频使用以防STW暂停。

怎么用 jmap 生成堆转储文件(heap dump)
直接用 jmap 抓取运行中 Java 进程的堆快照,是最常用也最轻量的方式。前提是进程还在、没 OOM 退出,且你有足够权限。
常见错误是没加 -dump:format=b,file=xxx.hprof 参数,只敲 jmap -heap ——这只会打印堆配置摘要,不生成 dump 文件。
-
jmap -dump:format=b,file=/tmp/heap.hprof:强制生成二进制格式 dump,这是分析工具(如 Eclipse MAT、VisualVM)唯一支持的格式 - 如果进程响应慢或卡住,加
-F强制执行:jmap -F -dump:format=b,file=/tmp/heap.hprof(需 root 或与目标进程同用户) - 避免在生产环境高频执行:
jmap -dump会触发全局 safepoint,导致应用暂停(STW),暂停时间取决于堆大小和 GC 状态
jmap 生成的 dump 文件为什么打不开或报错
不是所有 .hprof 文件都能被 MAT 或 JProfiler 正确识别——jmap 默认输出的是“传统 HPROF 格式”,但部分 JDK 版本(尤其是 JDK 8u261+ 和 JDK 11+)默认启用压缩指针(-XX:+UseCompressedOops),而老版本 MAT 可能解析失败,报错类似 Invalid HPROF file: unknown format version 或直接空白。
- 确认 JDK 和分析工具版本匹配:JDK 17+ 生成的 dump 建议用 Eclipse MAT 1.13+ 或 VisualVM 2.1+
- 不要用文本编辑器打开
.hprof文件——它不是文本,开头是二进制魔数JAVA PROFILE 1.0,强行查看会乱码甚至损坏 - 若 dump 文件极小(jmap 是否因权限不足静默失败,或目标 JVM 启用了
-XX:+DisableAttachMechanism
OOM 后自动抓 dump:靠 -XX:+HeapDumpOnOutOfMemoryError,别等手动 jmap
线上服务一旦 OOM 就崩溃,根本来不及连上去跑 jmap。这时候必须提前配置 JVM 参数,让 JVM 自己在抛出 java.lang.OutOfMemoryError: Java heap space 时自动生成 dump。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 启动时加参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dumps/,确保/data/dumps/目录存在且 JVM 进程有写权限 - 路径支持变量:如
-XX:HeapDumpPath=/data/dumps/oom_%p.hprof中的%p会被替换为进程 PID,避免多实例覆盖 - 注意磁盘空间:一个 4GB 堆的 dump 文件可能接近 3.5GB,务必监控
/data/dumps/所在分区剩余空间 - 该参数对
MetaspaceOOM 无效——那是另一类错误,需用-XX:+HeapDumpOnOutOfMemoryError -XX:NativeMemoryTracking=detail配合jcmd分析VM.native_memory
用 jmap -histo 快速定位大对象,比等 dump 分析更高效
有时候你不需要完整 dump,只想知道“现在堆里什么类占最多内存”,jmap -histo 是秒级命令,不触发 STW,适合高频巡检。
-
jmap -histo:live:只统计可达对象(触发一次 minor GC),结果更准;省略:live则包含已标记但未回收的对象 - 输出按 instance 数量降序,但真正关键的是
bytes列——关注[B(byte[])、char[]、java.util.HashMap$Node等基础容器类的字节数 - 配合
grep快速过滤:例如jmap -histo:live| grep -E "(String|HashMap|ArrayList)" - 注意:
jmap -histo不显示对象引用链,只能告诉你“谁大”,不能回答“谁创建的”,要查根源还得靠 dump + MAT 的 dominator tree
真正难的从来不是生成 dump,而是从几 GB 的二进制数据里快速锁定那个泄漏的 ArrayList 被哪个 Spring Bean 持有着——这时候 MAT 的 “Merge Shortest Paths to GC Roots” 功能比任何 jmap 参数都管用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










