记一次线上cpu占用率高的问题排查

记一次线上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 |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)同时浪费了线程资源,导致线程资源不够用

问题总结

1.慎重使用多线程,多线程虽然可以解决响应性能问题,但线程的频繁切换同样会浪费cpu资源
2.多个耗时操作有必要使用多线程,注意设置超时时间,避免阻塞带来的问题

参考JVM六:查找最最耗cpu的线程或线程时间最长并定位代码

你可能感兴趣的:(记一次线上cpu占用率高的问题排查)