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

Java 应用可通过 jmap 命令直接导出堆内存快照(heap dump),用于后续分析内存泄漏、对象分布等问题。关键前提是目标 Java 进程正在运行,且执行命令的用户对进程有足够权限(通常需与启动进程的用户一致,或具备 root 权限)。
确认 Java 进程 PID
导出前必须知道目标 JVM 的进程 ID(PID)。常用方式:
- 使用
jps -l列出本地所有 Java 进程及其主类或 JAR 路径,快速识别目标应用 - 若进程较多,可结合
ps aux | grep java查看完整启动命令,辅助判断 - 注意区分开发环境和生产环境——生产上可能有多个 Java 进程,务必核对 PID 准确性
使用 jmap 生成堆快照文件
最常用命令格式如下:
jmap -dump:format=b,file=/path/to/heap.hprof <pid></pid>
说明:
-
format=b表示二进制格式(HPROF 格式),这是主流分析工具(如 Eclipse MAT、VisualVM、JProfiler)支持的标准格式 -
file=指定输出路径,建议使用绝对路径,确保目录存在且有写入权限 - 执行后会触发 JVM 全堆 GC 并暂停应用(STW),对线上服务有短暂影响,慎用于高负载生产环境
避免常见问题
实际操作中容易遇到以下情况:
-
权限拒绝:非 root 用户无法 attach 到其他用户启动的 Java 进程;可尝试切换到应用启动用户执行,或在启动 JVM 时添加
-XX:+DisableAttachMechanism以外的默认配置(该参数会禁用 jmap) -
“Unable to open socket file”:JVM 启动时未启用 attach 功能,或 /tmp 目录被清理导致
hsperfdata_<user></user>文件丢失;可重启 JVM 或检查 /tmp 权限 -
文件过大或超时:大堆(如 >4GB)导出耗时长、占磁盘空间多;建议提前评估磁盘剩余空间,并考虑使用
jmap -histo先查看对象统计,缩小排查范围
替代方案(无侵入/低影响)
若不能接受 jmap 的 STW 影响,可考虑:
- 启动时加参数
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/,让 JVM 在 OOM 时自动保存快照 - 使用 JMX + VisualVM / JConsole 远程触发 dump(需开启 JMX 端口并配置权限)
- Spring Boot Actuator 配合
actuator/dump(旧版)或actuator/threaddump(线程级)、actuator/heapdump(2.x+ 需引入 micrometer-registry-jvm 等扩展)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











