JMap 参考文档 #

1. 什么是 JMap #

JMap 是 Java Development Kit (JDK) 自带的命令行工具,用于生成 Java 虚拟机 (JVM) 的内存映射信息和堆转储文件。它可以帮助开发者分析内存使用情况、排查内存泄漏问题以及进行性能调优。

2. 基本语法 #

bash
jmap [ option ] pid
jmap [ option ] executable core
jmap [ option ] [server-id@]remote-hostname-or-IP
  • option: 命令选项
  • pid: Java 进程 ID
  • executable: 产生 core dump 的 Java 可执行文件
  • core: 要分析的 core dump 文件
  • remote-hostname-or-IP: 远程调试服务器的主机名或 IP 地址
  • server-id: 远程调试服务器的 ID(可选)

3. 常用命令选项 #

3.1 基本信息选项 #

  • -heap: 打印 Java 堆详细信息
  • -histo[:live]: 打印 Java 对象的直方图,加上 :live 只统计存活对象
  • -clstats: 打印类加载器统计信息
  • -finalizerinfo: 打印等待终结的对象信息

3.2 堆转储选项 #

  • -dump:<dump-options>: 生成堆转储文件

    • format=b: 二进制格式
    • file=<filename>: 输出文件名
    • live: 仅转储存活对象
  • -F: 强制模式,当目标进程不响应时使用

4. 详细命令说明 #

4.1 查看堆内存信息 #

bash
jmap -heap <pid>

输出内容包括:

  • 堆配置信息(初始大小、最大大小等)
  • 堆空间使用情况(Eden 区、Survivor 区、老年代等)
  • GC 算法和收集器信息

4.2 生成对象直方图 #

bash
# 所有对象
jmap -histo <pid>

# 仅存活对象
jmap -histo:live <pid>

输出内容包括:

  • 类名
  • 对象数量
  • 占用内存大小
  • 类的全限定名

4.3 生成堆转储文件 #

bash
# 生成完整堆转储
jmap -dump:format=b,file=heapdump.bin <pid>

# 仅转储存活对象
jmap -dump:format=b,file=heapdump-live.bin,live <pid>

# 强制生成堆转储
jmap -F -dump:format=b,file=heapdump-force.bin <pid>

4.4 查看类加载器统计 #

bash
jmap -clstats <pid>

输出内容包括:

  • 类加载器名称
  • 加载的类数量
  • 占用内存大小
  • 父类加载器信息

5. 实际应用示例 #

5.1 排查内存泄漏 #

bash
# 1. 生成堆转储
jmap -dump:format=b,file=leak-dump.bin <pid>

# 2. 使用 JHat 分析堆转储
jhat leak-dump.bin

然后在浏览器中访问 http://localhost:7000 分析堆转储文件。

5.2 分析对象分布 #

bash
# 生成对象直方图并按内存占用排序
jmap -histo <pid> | head -20

5.3 监控内存使用趋势 #

bash
# 定期生成堆转储,监控内存变化
watch -n 30 "jmap -dump:format=b,file=heap-$(date +%H%M%S).bin <pid>"

6. 最佳实践 #

6.1 使用建议 #

  1. 定期分析:定期使用 JMap 生成堆转储,建立内存使用基线
  2. 结合其他工具:与 JHat、VisualVM、Eclipse MAT 等工具配合使用,效果更佳
  3. 生产环境注意事项
    • 生成堆转储可能会导致应用短暂停顿
    • 堆转储文件可能很大,确保有足够的磁盘空间
    • 优先使用 -dump:live 参数减少文件大小

6.2 性能影响 #

  • 生成堆转储会暂停 JVM(Stop-The-World),暂停时间取决于堆大小
  • -histo 命令相对轻量,适合日常监控
  • 在生产环境使用时,建议在低峰期执行

7. 常见问题与解决方案 #

7.1 权限问题 #

问题:执行 JMap 时出现 “Permission denied” 错误

解决方案

  • 确保使用与目标 Java 进程相同的用户执行 JMap
  • 或使用 root 用户执行

7.2 进程不响应 #

问题:目标进程对 JMap 命令无响应

解决方案

  • 使用 -F 参数强制执行
  • 注意:强制模式可能导致转储文件不完整

7.3 堆转储文件过大 #

问题:生成的堆转储文件超过磁盘空间

解决方案

  • 使用 -dump:live 参数只转储存活对象
  • 考虑在其他机器上分析转储文件

8. 相关工具 #

  • JHat:JDK 自带的堆转储分析工具
  • VisualVM:可视化 JVM 监控和分析工具
  • Eclipse MAT:强大的内存分析工具
  • JConsole:JVM 监控控制台

9. 总结 #

JMap 是 Java 开发者必备的内存分析工具之一,通过它可以深入了解 JVM 的内存使用情况,快速定位内存问题。结合其他分析工具,可以更有效地进行性能调优和问题排查。

建议开发者熟练掌握 JMap 的常用命令和使用场景,将其纳入日常开发和运维工作中,以提高应用的稳定性和性能。

最后更新:2026-02-05