jmap 命令详解

685 阅读3分钟

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:指定输出文件名。

生成的堆转储文件可以使用工具(如 jhatVisualVMEclipse 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 命令