第一步是用jmap导出准确可用的二进制.hprof快照:先用jps -l确认目标PID,再以同一用户执行jmap -dump:format=b,file=/tmp/heap_$(date +%Y%m%d_%H%M%S).hprof ,必要时加-F强制导出,导出后须验证文件大小与类型。

排查 Java 内存泄漏,第一步是拿到准确、可用的堆内存快照(.hprof 文件),而 jmap 是最直接、无需额外依赖的手段。关键不在于“能不能导出”,而在于“导得准、导得稳、导得能用”。
确认目标进程并获取 PID
必须确保操作的是正确的 Java 应用进程,尤其在多实例或容器化环境中:
- 用
jps -l查看本地所有 Java 进程及其主类或 JAR 路径,快速定位目标应用 - 若进程由 systemd、Docker 或 Kubernetes 管理,可结合
ps -ef | grep java、netstat -tuln | grep :端口号或容器内执行jps -l交叉验证 - 务必使用与启动该 Java 进程**同一用户**执行后续命令,否则会因 attach 权限被拒
执行 jmap 导出标准 HPROF 快照
只推荐一种可靠格式:二进制 HPROF,兼容 MAT、JProfiler、VisualVM 等全部主流分析工具:
- 基础命令:
jmap -dump:format=b,file=/tmp/heap_$(date +%Y%m%d_%H%M%S).hprof -
format=b不可省略,表示二进制格式;缺省或写错会导致文件无效 - 路径建议用绝对路径,且确保目录存在、有写权限(
/tmp最稳妥) - 如进程无响应,可加
-F强制执行:jmap -F -dump:format=b,file=/tmp/heap_forced.hprof,但快照可能不完整
导出后必须做的三件事
导出完成不等于可以分析,跳过验证易踩坑:
- 检查文件大小和类型:
ls -lh /tmp/heap_*.hprof看是否明显偏小(如 file heap_*.hprof 确认输出含 “Java HPROF dump” 字样 - 大文件建议先压缩再传输:
gzip heap_*.hprof,避免下载中断或磁盘空间不足 - 本地用 Eclipse MAT 打开时,分配足够堆内存(如
java -Xmx6g -jar mat.jar),否则加载失败或分析不准
更稳妥的替代方案(优先用于生产)
手动 jmap 会触发 Full GC 并暂停应用(STW),高负载时风险高。建议日常就配置好兜底机制:
- 启动 JVM 时加上:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/app/dumps/,OOM 时自动保存,零人工干预 - Spring Boot 2.x+ 可启用 Actuator 的
/actuator/heapdump(需配置management.endpoints.web.exposure.include=heapdump和安全策略) - 已开启 JMX 的应用,可通过 JConsole 或 VisualVM 远程连接后图形化触发 dump,避免直接登录服务器
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











