分享一次cpu98%的问题排查

时间:2024-03-28 20:12:53

1.第一步 执行top,很明显pid是1的进程的cpu占用特别高

分享一次cpu98%的问题排查

 

2.第二步 执行top -Hp 1,查看到进程1下面的pid是8,9,10,11这四个线程的cpu占用比较异常

对应java程序里的tid是0x8 0x9 0xa 0xb。

分享一次cpu98%的问题排查

3.第三步执行jstack 1 > 20191107.log 获取到日志文件,查到刚好是垃圾回收的几个线程

分享一次cpu98%的问题排查

 

4.第四步再执行jstat -gcutil 1 2000

分享一次cpu98%的问题排查

发现FGC很频繁,而且有没次fgc的效率不高,就算回收了还是暂用97、98%,说明有大量的老年代对象没有被回收

5.第五步,是什么原因导致老年代对象没有被回收呢,首先我们先执行java -XX:+PrintCommandLineFlags -version

查看jvm的堆参数配置以及垃圾回收器

分享一次cpu98%的问题排查

最大堆内存大小是2G 左右,垃圾回收是ParallelGC 并行垃圾回收器

分享一次cpu98%的问题排查

newRatio 等于2,老年代,占比2/3,4/3g * 98% = 1.306g的老年代堆内存一直不能被回收。

6.第六步,执行jmap -dump:format=b,file=20191029.dump 1,生成dump文件,使用visualVm工具打开dump文件,

分享一次cpu98%的问题排查