jmap详解
jmap(Java Memory Map)是 JDK 自带的命令行工具,用于生成 Java 程序的内存快照(堆转储)和分析堆内存中的对象分布。它在 JVM 性能调优、内存泄漏排查等场景中非常有用。以下是 jmap 的详解,包括常用命令、参数和应用场景。
1. 基本功能
- 生成堆转储文件(Heap Dump,
.hprof文件),供后续分析(如使用 Eclipse MAT、VisualVM 等工具)。 - 查看堆内存的总体使用情况(如分代内存分布)。
- 查看类加载器、对象直方图(对象实例数量和内存占用)。
2. 常用命令
jmap [options] <pid> # 连接到 Java 进程并执行操作
2.1 查看堆内存摘要
jmap -heap <pid>
输出示例:
Heap Configuration: # 堆配置(各分代大小、GC 参数)
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
...
Heap Usage: # 各内存区域使用情况(Eden、Survivor、Old Gen 等)
PS Young Generation:
Eden Space:
capacity = 12582912 (12.0MB)
used = 4194304 (4.0MB)
...
2.2 生成堆转储文件
jmap -dump:[live,]format=b,file=<filename.hprof> <pid>
live(可选):仅转储存活对象(触发 Full GC)。file: 指定输出文件名(推荐.hprof扩展名)。
示例:
jmap -dump:live,format=b,file=heapdump.hprof 1234
2.3 查看对象直方图
jmap -histo[:live] <pid>
- 显示堆中每个类的实例数量和内存占用。
live(可选):仅统计存活对象(触发 GC)。
输出示例:
num #instances #bytes class name
----------------------------------------------
1: 1000000 200000000 [B # byte 数组
2: 500000 80000000 java.lang.String
3: 20000 3200000 java.lang.Class
...
2.4 查看类加载器信息
jmap -clstats <pid>
输出类加载器的统计信息(如加载的类数量、内存占用等),常用于排查类加载器泄漏问题。
3. 典型应用场景
3.1 内存泄漏分析
通过生成堆转储,结合 Eclipse MAT 等工具,分析大对象、冗余对象或未被释放的对象引用。
3.2 内存使用优化
分析对象直方图,识别内存占用高的类(如过多重复字符串或大数组),优化代码或缓存策略。
3.3 Full GC 频繁
结合 -heap 查看各内存区域用量,判断是否存在年轻代过小或老年代过早填满的问题。
3.4 类加载器泄漏
使用 -clstats 确认是否有冗余类加载器未被回收,常见于动态生成类的框架(如 Groovy)。
4. 注意事项
- 权限要求:执行
jmap的用户需与 Java 进程所有者一致(Linux 中需同一用户或有sudo权限)。 - 进程暂停:生成堆转储时可能短暂暂停 JVM(尤其是大堆),生产环境谨慎操作。
- JDK 版本兼容性:
- Java 8 后推荐使用
jcmd替代部分功能(如jcmd <pid> GC.heap_dump filename生成转储)。 - 部分选项(如
-permstat)在 Java 8+ 中已废弃(元空间取代永久代)。
- Java 8 后推荐使用
- 强制转储:若进程无响应,可使用
jmap -F(强制模式),但可能导致数据不一致。
5. 示例步骤
-
查找 Java 进程 PID:
jps -l # 输出示例:1234 com.example.Main -
生成堆转储:
jmap -dump:live,format=b,file=heap.hprof 1234 -
分析转储文件:
- 使用 Eclipse Memory Analyzer (MAT) 打开
heap.hprof,分析内存泄漏或大对象。
- 使用 Eclipse Memory Analyzer (MAT) 打开
6. 替代工具
- jcmd:更现代的 JDK 工具,集成了
jmap、jstack等功能。jcmd <pid> GC.heap_dump filename=heap.hprof - VisualVM:图形化工具,支持实时监控和堆转储分析。
- Async-Profiler:低开销的堆分析工具,适合生产环境。
通过灵活使用 jmap,可以高效定位内存问题,但需结合其他工具(如 MAT)和日志(如 GC 日志)进行综合分析。
浙公网安备 33010602011771号