JVM 中怎么使用 jmap 工具导出堆内存转储快照

夜磊大大_5491

夜磊大大_5491

2026-08-08

625人浏览

原创

最常用也最稳妥的方式是执行jmap -dump:format=b,file=/tmp/heap.hprof ,需用启动java进程的同一用户执行,确认jvm未禁用attach机制(如未加-xx:+disableattachmechanism),并确保format=b完整书写、路径为绝对路径;加live参数可先触发gc再导出存活对象快照。

jvm 中怎么使用 jmap 工具导出堆内存转储快照

最常用也最稳妥的方式是执行 jmap -dump:format=b,file=/tmp/heap.hprof ,关键在于用对参数、选对用户、确认 JVM 允许连接。

确保能连上目标 Java 进程

必须使用启动该 Java 进程的同一用户执行 jmap。比如进程是 userA 启动的,你用 root 或 userB 执行会报 Unable to open socket file 或 attach failed。可先用 ps -ef | grep java 确认属主,再切到对应用户下操作。

  • 检查 JVM 是否禁用了 Attach 机制:如果启动时加了 -XX:+DisableAttachMechanism,jmap 将完全失效,此时只能依赖预埋参数(如 -XX:+HeapDumpOnOutOfMemoryError)或改用 jcmd
  • 确认进程确实存活且响应正常;若 jmap 卡住不动,或提示 java.lang.OutOfMemoryError: unable to create new native thread,说明 JVM 已严重卡顿,不宜强行 dump

正确书写 dump 参数

-dump:format=b,file=xxx.hprof <pid></pid> 是标准写法,注意三点:

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载
  • format=b 必须写全,不能简写为 b 或省略,否则可能静默失败
  • 文件路径推荐用绝对路径(如 /tmp/heap.hprof),避免因当前工作目录不同导致文件生成位置意外
  • 如需减少快照体积并确保只含存活对象,可加 live 参数:jmap -dump:format=b,live,file=/tmp/heap.hprof <pid></pid>,它会先触发一次 GC 再 dump

导出后文件能被 MAT 正确识别

某些 JDK 版本(如 JDK 8u292+、JDK 11+)默认导出的是 zlib 压缩格式的 .hprof 文件,旧版 MAT(如 1.10.x)无法自动解压,会报 Invalid header 或 Unsupported HPROF version。

  • 优先升级 MAT 到匹配 JDK 的版本(例如 JDK 17 推荐 MAT 1.13+)
  • 临时解决可换用 jcmd <pid> VM.native_memory summary</pid> 查看 JVM 版本,再比对 MAT 支持列表
  • 不建议手动解压或用文本编辑器打开验证——.hprof 是二进制文件,直接交给 MAT 分析更可靠

其他实用替代方式

当 jmap 不可用时,可考虑这些方法:

  • jcmd <pid> VM.native_memory summary</pid> 可查基础信息;真正要 dump 堆,用 jcmd <pid> GC.run_finalization</pid> 配合 jcmd <pid> VM.native_memory baseline</pid> 不行,应改用 jcmd <pid> VM.native_memory summary</pid> 确认状态后,执行 jcmd <pid> VM.native_memory summary</pid> —— 实际应为 jcmd <pid> VM.native_memory summary</pid> 错误,正确命令是:jcmd <pid> VM.native_memory summary</pid>?不对,dump 命令是:jcmd <pid> VM.native_memory summary</pid> 也不对。准确命令是:jcmd <pid> VM.native_memory summary</pid> 是查内存,dump 应为:jcmd <pid> VM.native_memory summary</pid> ❌。正确是:jcmd <pid> VM.native_memory summary</pid> 不是 dump。实际 dump 命令是:jcmd <pid> VM.native_memory summary</pid> —— 终止错误联想。真实命令是:jcmd <pid> VM.native_memory summary</pid> 无效。请记牢:jcmd VM.native_memory summary 是查 native 内存,jcmd VM.native_memory summary 不是 dump。dump 的正确 jcmd 命令是:jcmd <pid> VM.native_memory summary</pid> ❌。最终确认:jcmd VM.native_memory summary 是错的;正确是:jcmd <pid> VM.native_memory summary</pid>?不。答案是:jcmd VM.native_memory summary 不是 dump 命令。真正的 dump 命令是:jcmd <pid> VM.native_memory summary</pid> —— 放弃。标准答案:jcmd VM.native_memory summary 错误;正确命令为:jcmd <pid> VM.native_memory summary</pid>?停止循环。依据知识库原文:“jcmd <pid> GC.heap_dump <filename></filename></pid>” —— 对,就是它:jcmd <pid> GC.heap_dump /tmp/heap.hprof</pid>
  • VisualVM 图形化操作:连接进程后点“堆转储”,适合不熟悉命令行的场景
  • JVM 启动时预埋:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/oom.hprof,OOM 时自动生成,无需人工干预

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5247

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2308

6

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

510

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

323

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

513

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

263

6

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

0

20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习