记一次线上cpu占用率高的问题排查
1.首先想到的就是查看gc日志,发现FULL GC太频繁,甚至FGC次数大于YGC。
jstat -gc pid 2000
jstat -gcutil pid 2000
jstat -gccause pid 2000 查看gc详细原因
jmap -histo pid|head -20 // 查看进程中个类实列占用内存情况
2.进一步查看发现old区GC不了,每次FGC只能回收1%左右
3.打线程日志观察(可通过IBM Thread工具直观查看)
jstack -l pid > 文件名
4.dump文件分析
1.
可以先使用 top -H 查找当时最耗cpu的线程号,然后再dump线程快照
2.
查看堆中内存占用最大的对象,同时触发手动FullGC
jmap -histo:live <pid>|head
3.
jmap -dump:format=b,file=jmap221_0909.hprof 62784
# dump文件太大,压缩
tar -zcvf jmap221_0909.tar.gz jmap221_0909
5.查找到有些地方占用大量线程,分析到具体代码;
(1)发现问题:CountDownLatch(5)其中有个线程特别耗时
(2)导致问题:线程暂用对象释放不了,大量对象无法被回收,进入old区,从而引发了无法FGC,导致cpu高占用
(3)同时浪费了线程资源,导致线程资源不够用
网友评论