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 进程 IDexecutable: 产生 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 使用建议 #
- 定期分析:定期使用 JMap 生成堆转储,建立内存使用基线
- 结合其他工具:与 JHat、VisualVM、Eclipse MAT 等工具配合使用,效果更佳
- 生产环境注意事项:
- 生成堆转储可能会导致应用短暂停顿
- 堆转储文件可能很大,确保有足够的磁盘空间
- 优先使用
-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