《深入理解Java虚拟机》学习笔记。
在定位问题的时候,知识和经验是关键基础,数据是依据,而工具是运用知识处理数据的手段…
jmap
命令用于生成堆转储快照(一般称为heapdump或dump文件)。
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html
jmap: Java 内存映像工具
1 简介
jmap(Memory Map for Java)用于生成堆转储快照。
生成堆转储快照的其他方法:
-XX:+HeapDumpOnOutOfMemoryError
: 在虚拟机在OOM异常之后自动生成dump文件。
-XX:+HeapDumpOnCtrlBreak
: 使用[Ctrl]+[Break]键让虚拟机生成dump文件,或者KILL -3
发出进程退出信号”吓唬“一下虚拟机,也能拿到dump文件。
2 用法
2.1 jmap 语法格式
1 | jmap [ option ] vmid |
1 | jmap -help |
2.2 选项(option)
选项 | 说明 |
---|---|
-heap | 显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等 |
-histo[:live] | 显示堆中对象统计信息,包括类、实例数量、合计容量。格式为:jmap histo:live |
-clstats | 显示类加载统计信息 |
-finalizeinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象 |
-dump | 生成Java堆转储快照。格式为:jmap -dump:[live, ]format=b, file= |
-F | 当-dump没有响应时,强制生成dump快照 |
-h | -help | 帮助信息 |
-J |
直接将参数传递给运行中的JVM系统 |
3 实战
3.1 查看进程的堆详情
1 | jmap -heap <pid> |
1 | jmap -heap 27431 |
分析总结:
年轻代的回收策略是空间换时间。
如果from
区利用率持续100%,说明程序创建了大量的短生命周期的对象。此时可以通过jstat
工具查看gc情况,通过ygc和fgc频率来评估内存参数和gc参数是否合理。
多次ygc后,s区变化不大时,需要考虑是否发生了空间分配担保。
注意:在使用CMS GC 情况下,jmap -heap
的执行有可能会导致JAVA 进程挂起。所以一般线上服务禁止使用,除非是保留现场,然后重启服务时。
3.2 查看对象实例的内存情况
1 | jmap -histo:live <pid> |
1 | num #instances #bytes class name |
说明:
1 | instance 是对象的实例个数 |
分析总结:``jmap -histo:live`会触发一次gc,然后再统计信息。
什么时候用到呢?
通常是在频繁发生fullgc等情况下,查看是什么对象实例大量占用内存,来分析是否存在内存泄漏等。
另外还可以将定时周期性执行jmap -histo:live <pid> > jmap.histo.info
将堆中对象情况导出到文件,然后通过比对工具比对不同时期的文件,来判断哪些对象可回收,哪些不可回收。
3.3 heapdump文件
1 | jmap -dump:live,format=b,file=<dumpfilename> <pid> |
需要注意的是,一般dump时,服务会暂停,在线上执行时需要格外小心。
通常用于分析线上服务发生OOM时。对于发生OOM的服务,在启动时设置如下参数,以便保留现场:
1 | -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/ |
对于heapdump文件,通常采用MAT(Memory Analyze Tool)来分析。
4 总结
通常,如果线上服务频繁发生fullGC或内存不够的情况,往往是发生了内存泄漏。关于内存泄漏的排查的思路如下:
- 第一步:
jmap -histo:live <pid>
查看大对象:主要关注应用自身的对象。(慎用jmap -heap
) - 第二步:
jstat -gcutil <pid> 1000 1000
查看gc情况:gc或fullgc越频繁,说明内存泄漏的可能越大 - 第三步:
jmap -dump:live,format=b,file=<dumpfilename> <pid>
抓现场:及时保留现场,用于后续分析。也可以多dump几次,后续对多个dump文件进行对比分析。
内存不足或频繁fullgc,首先快速执行三步曲,保留现场。再考虑重启服务进行深入排查。
5 Ths
54686973 20617274 69636C65 20697320 64656469 63617465 6420746F 20526F6E 67657220 77686F20 49206465 65706C79 206C6F76 65642E
本文链接: https://stefanxiepj.github.io/archives/45510040.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
![知识共享许可协议](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)