一. 简单说明
jmap是和JVM堆内存相关的命令,比如dump出堆内存、堆内存的基本使用情况、堆内存使用情况直方图等等。
二. 使用方法
|
|
选项 | 说明 | 影响程度 | 重要程度 |
---|---|---|---|
-heap | 显示堆内存的详细信息(例如:回收器信息、分代内存等等) | 不会对线上有影响 | 五星 |
-histo | 显示堆内存中对象的统计信息,类似直方图 | 不会对线上有影响 | 五星 |
-dump | 生成堆内存的快照 | 轻易不要在线上使用 | 四星 |
-F | 强制生成快照 | 轻易不要在线上使用 | 四星 |
-permstat | 以classloader为统计口径查看永久代信息 | 测试了一下应该对线上有影响(确实没用过) | 三星 |
|
|
1. -heap
##### (1) 查看jvm的相关参数
(2) 执行并分析jmap -heap
|
|
(3) 一些重要信息
- SurvivorRatio=x代表两个survivor和eden的比率是2:x。
- Heap Usage中的New Generation = 一个eden + 一个survior,原因是因为在年轻代使用了复制算法。
- Heap Configuration中的很多参数都作废了,不要特别进行关注,否则容易混淆。
2. -histo
histo可以计算出className, 对象个数,所占内存的一个统计表。(以所占内存倒序)。
通常来说,我们比较关心钱多少个,对于分析内存溢出和泄露比较有帮助(尤其是自己公司的包名)。
所以通常我们可以只关心前10~50最大的,就可以执行这个命令。
这种方式可以不需要dump出堆内存,使用MAT那样的工具来分析,就可以得到堆的统计信息,在实际生产中是一个很有帮助的命令。
|
|
3. -dump
把整个堆内存dump到硬盘中,后期可以结合MAT来进行详细分析。
-dump[live,] live代表只把活的对象dump出来。
|
|
除了这个方法还有几种方法能将堆内存dump出来:
1.-XX:+HeadDumpOnOutOfMemoryError:在出现OOM异常自动dump
2.-XX:+HeapDumpOnCtrlBreak: ctrl + break键,这个不太常用
3.kill -3: 这个也不常用。
三、简单总结
jmap还是一个分析堆内存使用情况比较实用的一个工具(heap histo dump),如果想更为详细的分析堆内存的使用,可以使用MAT进行,以后有机会再进行介绍。