jmap 是 Java 开发工具包(JDK)中的一个命令行工具,用于生成 Java 虚拟机(JVM)进程的内存映射信息或堆转储(heap dump)。它可以帮助开发者分析 Java 应用程序的内存使用情况,诊断内存泄漏、对象分布等问题。
1. 基本用法
jmap [options] <pid>
<pid>:目标 Java 进程的进程 ID(Process ID)。[options]:可选参数。
2. 常用选项
| 选项 | 说明 |
|---|---|
-heap | 显示 Java 堆的详细信息,包括堆配置和使用情况。 |
-histo | 显示堆中对象的直方图,包括对象的数量和大小。 |
-histo:live | 仅显示存活对象的直方图(会触发 Full GC)。 |
-dump:<format> | 生成堆转储文件(heap dump),格式为 live(仅存活对象)或 all(所有对象)。 |
-finalizerinfo | 显示等待终结的对象信息。 |
-clstats | 显示类加载器的统计信息。 |
-F | 强制生成堆转储(当 JVM 无响应时使用)。 |
-h 或 -help | 显示帮助信息。 |
3. 常用命令示例
1. 显示堆的详细信息
jmap -heap <pid>
输出内容包括:
- 堆的配置(如初始大小、最大大小、使用的垃圾回收器等)。
- 各个内存区域(如 Eden、Survivor、Old Gen)的使用情况。
2. 显示堆中对象的直方图
jmap -histo <pid>
输出内容包括:
- 对象的类名。
- 实例数量。
- 占用内存大小(单位:字节)。
如果需要仅显示存活对象,可以加上 :live:
jmap -histo:live <pid>
3. 生成堆转储文件
jmap -dump:live,format=b,file=heapdump.hprof <pid>
live:仅转储存活对象。format=b:指定二进制格式。file=heapdump.hprof:指定输出文件名。
生成的堆转储文件可以使用工具(如 jhat、VisualVM、Eclipse MAT)进行分析。
4. 显示类加载器统计信息
jmap -clstats <pid>
输出内容包括:
- 类加载器的名称。
- 加载的类数量。
- 占用内存大小。
4. 使用场景
- 分析内存使用情况:通过
-heap和-histo选项,可以查看堆的使用情况和对象分布。 - 诊断内存泄漏:通过生成堆转储文件,分析对象的引用链,定位内存泄漏问题。
- 优化内存配置:通过堆的详细信息,调整 JVM 的内存参数(如
-Xmx、-Xms)。 - 监控对象创建:通过直方图,查看哪些对象占用了大量内存。
5. 注意事项
jmap需要与目标 JVM 进程运行在相同的用户权限下,否则可能会失败。- 生成堆转储文件时,可能会暂停 JVM 进程(尤其是使用
-dump:live时),因此需谨慎在生产环境中使用。 jmap只能用于 HotSpot JVM,其他 JVM 实现(如 IBM J9)可能需要使用不同的工具。
6. 结合其他工具
jps:用于列出当前系统中的 Java 进程及其 PID,方便找到目标进程。jstat:用于监控 JVM 的垃圾回收和内存使用情况。jhat:用于分析堆转储文件。VisualVM或Eclipse MAT:图形化工具,用于分析堆转储文件。
7. 示例
查看堆的详细信息
jmap -heap 12345
生成堆转储文件
jmap -dump:live,format=b,file=heapdump.hprof 12345
显示对象直方图
jmap -histo:live 12345
通过 jmap,开发者可以深入了解 JVM 的内存使用情况,从而快速定位和解决内存相关的问题。
8. 参考
developer.jdcloud.com/article/313… jmap 命令详解 jstack命令详解 Linux top 命令