前言
在 Java 应用运维中,内存泄漏(Memory Leak)和内存溢出(OutOfMemoryError, OOM)是高频且棘手的问题。它们往往表现为应用响应缓慢、频繁 Full GC,最终导致进程崩溃。
jmap(Java Memory Map)是 JDK 自带的免费命令行工具,无需额外安装,随 JDK 一同部署。它的核心用途是生成 Java 堆转储快照(Heap Dump)以及查看 Java 进程的堆内存详细使用情况,是排查 Java 内存相关问题的核心利器之一。
jmap 核心用途
- 查看堆配置与实时使用:快速定位堆内存区域(新生代、老年代)的占用异常;
- 生成堆转储文件:输出二进制格式的
.hprof文件,为后续通过 MAT、VisualVM 等工具进行深度分析提供数据支撑; - 对象统计:查看堆中对象的数量及内存占用,快速定位大对象或高频创建的对象;
- 元空间/永久代监控:查看永久代(JDK 7 及以前)或元空间(JDK 8 及以后)的使用情况,以及等待垃圾回收的对象信息。
常用选项详解
jmap 的核心语法格式为 jmap [option] <pid>,其中 pid 可通过 jps 或 ps -ef | grep java 获取。
核心常用选项
-heap:打印 Java 堆的完整概要信息。包含当前 JVM 使用的 GC 算法、堆内存配置参数(初始值、最大值、分区大小等),以及各内存代(Eden、Survivor、老年代)的实时占用比例。-histo[:live]:打印堆中对象的直方图统计信息。默认统计所有对象,加上:live后缀会先触发一次 Full GC,仅统计存活对象,避免无用数据干扰。-permstat:专用于 JDK 7 及以前版本,打印永久代统计信息。JDK 8+ 已用元空间替代,该选项失效,建议改用-heap或jstat -gcmetacapacity。-finalizerinfo:打印等待进入finalize()方法的对象信息,可用于判断是否有大量对象滞留在最终回收队列。-dump:<dump-options>:以 hprof 二进制格式将 Java 堆信息输出到指定文件。生成的文件无法直接打开,需借助专业工具解析。
dump 专属选项
配合 -dump 使用时,可添加以下子选项:
live:仅输出存活对象(会触发 Full GC);format=b:强制指定二进制格式(hprof),这是标准格式,必须指定;file=<path>:指定保存路径和文件名,必填项。
特殊选项:-F
当目标 Java 进程无响应(卡死、阻塞)时,可与 -dump 或 -histo 配合使用,强制执行操作。注意:不支持 live 子选项,且生成的文件可能不完整,仅作为应急手段。
实战:命令与输出解读
查看 Java 堆配置与使用情况
运行以下命令即可查看指定进程的堆内存详情:
jmap -heap 24126
拿到输出后,我们重点看这几部分:
- :如 ,确认使用的是并行收集器。


