使用jmap导出heap dump需先确认pid、权限和磁盘空间,再执行jmap -dump:format=b,file=heap.hprof 命令生成hprof文件,生产环境建议加live参数避免full gc,导出后用file或mat验证有效性。

当 Java 应用出现内存泄漏,怀疑对象持续堆积时,用 jmap 导出 Heap Dump 是最直接的诊断手段之一。关键在于选对时机、用对参数,并确保目标进程有足够权限和磁盘空间。
确认目标 Java 进程 PID
先通过 jps -l 或 ps aux | grep java 找到正在运行的 Java 进程 ID(PID)。注意区分多个 Java 进程,避免导出错实例的堆。
-
jps -l显示主类全名 + PID,适合 Spring Boot 等 jar 启动方式 - 若进程以普通用户启动,
jmap也需用同一用户执行,否则会报Unable to open socket file
用 jmap -dump 导出二进制 Heap Dump 文件
推荐使用以下命令,生成标准 HPROF 格式 dump 文件,兼容 VisualVM、JProfiler、Eclipse MAT 等工具:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
jmap -dump:format=b,file=heap.hprof <pid></pid>
-
format=b表示二进制格式(必须,文本格式不支持完整对象图) -
file=heap.hprof指定输出路径,建议用绝对路径,避免因工作目录不明确导致写入失败 - 该操作会触发 Full GC(取决于 JVM 版本),可能造成短暂停顿,生产环境慎用;如需无 GC 导出,可加
live参数:-dump:live,format=b,file=heap.hprof <pid></pid>(只保留可达对象)
导出前检查与常见问题
执行前快速确认几项,能避免多数失败:
- 目标进程仍在运行且未被挂起(
kill -0 <pid></pid>可验证) - 当前用户对目标进程有
ptrace权限(Linux 上常需同用户或 root;容器中可能需--cap-add=SYS_PTRACE) - 磁盘剩余空间 ≥ 当前堆最大值(可用
jstat -gc <pid></pid>查看max heap,预留 1.2 倍空间更稳妥) - 若提示
Not able to attach to process,可能是 JVM 启动时加了-XX:+DisableAttachMechanism,此时jmap不可用,需改用 JMX 或启动时开启-XX:+HeapDumpOnOutOfMemoryError
导出后快速验证文件有效性
生成的 heap.hprof 文件不是纯文本,但可通过简单方式确认是否有效:
- 用
file heap.hprof查看是否含Java Heap Dump字样 - 用
head -c 100 heap.hprof | strings看开头是否有类似JAVA PROFILE 1.0的标识 - 在 Eclipse MAT 中尝试打开 —— 若报 “Unrecognized format” 或卡死,大概率是导出失败或文件损坏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










