最常用命令是jmap -dump:format=b,file=/path/to/heap.hprof ,需先用jps -l或ps aux | grep java确认pid,注意权限、路径、stw影响及jvm未禁用attach机制。

用 jmap 导出 Java 进程的堆内存快照(即 heap dump 文件),最常用的是 -dump 选项,需指定进程 ID 和输出路径。
确认目标 Java 进程 PID
先用 jps -l 或 ps aux | grep java 找到要分析的 Java 进程 ID(PID):
-
jps -l显示主类或 jar 路径 + PID,适合开发环境 -
ps aux | grep java更全面,可结合grep -v grep过滤干扰行 - 若进程以服务方式运行(如 systemd),可用
systemctl status your-service查 PID
执行 jmap dump 命令
基本语法为:
说明:
-
format=b表示二进制格式(HPROF 格式),这是标准且被大多数工具(如 VisualVM、JProfiler、Eclipse MAT)支持的格式 -
file=后跟绝对路径,确保目标目录存在且当前用户有写权限 - 命令会触发一次 Full GC(默认行为),使 dump 更接近“真实堆占用”,如需跳过 GC,加
live参数:-dump:live,format=b,file=...
常见问题与注意事项
导出过程可能失败,注意以下几点:
-
权限不足:Linux 下若 jmap 与目标进程用户不同(如用 root 查普通用户启动的 Java 进程),可能报错
Unable to get pid of LinuxThreads manager thread;建议用同一用户执行 -
进程无响应或卡住:dump 大堆(如 >4GB)耗时较长,期间应用会暂停(Stop-The-World),生产环境慎用;可考虑先用
jmap -histo <pid></pid>快速查看对象统计 -
OpenJDK 与 JDK 版本差异:JDK 8 及以后推荐用
jcmd <pid> VM.native_memory summary</pid>配合jmap;JDK 11+ 中jmap -histo仍可用,但部分参数(如-permstat)已移除 -
容器环境(如 Docker):需进入容器执行,或挂载
/proc和/sys到调试容器中,否则 jmap 无法读取目标进程内存信息
验证 dump 文件是否有效
生成后可用以下方式快速检查:
- 用
file heap.hprof看是否含Java Heap Dump字样 - 用
head -c 100 heap.hprof | hexdump -C查看开头是否有 HPROF 格式标识(如java-profile相关 magic bytes) - 用 VisualVM 或 Eclipse MAT 尝试打开,看能否加载摘要信息(如总对象数、GC roots 数)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











