排查思路
1)檢查jvm內存的分配情況
2)檢查jvm的gc情況
3)?找出占用量比較大的對象
第一步:jmap -heap PID 查看jvm內存使用情況
? ? ? ? jmap?-heap 2525
????????可以看到老年代年輕代等其他內存區域內存使用率百分比
第二步:jstat -gc PID 查看GC的情況
????????jstat -gc 2525
????????jstat -gcutil 2525 1000? ? ??1000m打印一次gc情況
????????YGC : YG GC的次數
????????YGCT:YG GC的平均時間
????????FGC: FULL GC的次數
????????FGCT:FULL GC的平均時間
????????發現FULL GC的次數在瘋狂增長,而且FULL GC的平均時間也會增長,這就是CPU100%的原因,因為CPU一直在嘗試垃圾回收
第三步:?jmap -histo:live +進程id|more 命令,找出堆中占用量比較大的存活的對象
????????注意:一般不通過直接采用jmap dump 命令導出系統日志,因為dump操作長時間,很耗cpu資源,一般建議通過 jvm參數配置,在發生oom時,自動dump生成系統jvm快照文件,然后結合mat工具進行分析。
????????-XX:+HeapDumpOnOutOfMemoryError
????????#生成堆文件地址:?-XX:HeapDumpPath=/home/liuke/jvmlogs/ ?
????????其實可以直接生成dump文件,下載下來,到idea中分析:
????????一般第三步不建議用,直接用第四步
第四步:下載dump文件,分析內存告警
????????1:找到Java服務: jps 或者 ps -ef | grep java
????????2:生成dump 文件:jmap -dump:file=/tmp/dump.bin 1
? ? ? ? 3:壓縮dump文件 tar -zcvf dump.tar.gz dump.bin
????????在真實線上生成的 dump 文件都很大,所以我們需要把它壓縮成 tar.gz 文件,可以減少6倍以上的大小。
第五步:查看dump文件
? ? ? ? 可以用jdk的visualvm,把dump文件拖進去就可以,還可以直接把dump導入到idea中,也能看。
????????毫無疑問,內存飆升,我們只需要看看當前系統中內存占比最大的是個什么東西,然后想辦法干掉它
參考文章:
JVM線程、內存問題排查_jvm 線程8000多-CSDN博客
線上java JVM問題排查-騰訊云開發者社區-騰訊云
JVM實戰系列之CPU100%和內存100%排查_java_腳本之家
https://blog.51cto.com/u_5650011/5478722
JVM查看內存信息及“調優”方式_jvm查看某個進程占用內存-CSDN博客