CPU利用率高,如何排查?

CPU利用率高,可能的原因

代码中有比较耗CPU的操作,比如循环等(重点关注)
  1. 查看当前CPU消耗过高的进程
  2. 通过进程ID,找到哪些线程CPU过高
  3. 通过jstack查看当前线程具体的堆栈信息
Full GC 次数过多(重点关注)
  • 线上多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程
  • 通过jstat命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。
可能原因
  • 代码中一次获取了大量的对象,导致内存溢出,此时可以通过eclipse的mat工具查看内存中有哪些对象比较多;
  • 内存占用不高,但是Full GC次数还是比较多,此时可能是显示的 System.gc()调用导致GC次数过多,这可以通过添加 -XX:+DisableExplicitGC来禁用JVM对显示GC的响应。
参考命令
1. top 查看进程
2. top -Hp [pid] 查看线程
3. printf "%x
" [tid] 线程ID转为16进制
4. jstack [pid] |grep [tid] -A 30 打印线程的堆栈信息
5. jstack -gcutil [pid] [interval] [count] 查看GC相关区域的使用率(utilization)统计,重点关注FGC指标

参考

  1. https://www.cnblogs.com/java-stack/p/11952016.html
原文地址:https://www.cnblogs.com/zendwang/p/solve-cpu-usage-high-question.html