背景
开发生产中,有时候我们会碰到告警,CPU过高,超过100%,这个时候我们应该怎么办?
解决方案
java进程导致CPU过高
定位耗费CPU的进程
top -c
命令,显示进程列表。然后输入P(大写),按照CPU排序。
如果是Java进程引起的CPU偏高,然后分析为什么这个Java进程对应的线程。进而找到原因。
定位耗费CPU的线程
top -Hp 进程ID
,输入P按照CPU排序。
定位哪段代码导致CPU过高
printf "%x\n" 线程ID
把线程pid转换为16进制。
然后用jstack命令打印进程的堆栈信息,通过grep那个线程的16进制pid,找到那个线程相关的东西。在打印的对战信息中,查找是哪个类的哪个方法导致的CPU 100%的问题。然后去解决问题。jstack 进程ID | grep '0x16进制线程ID' -C5 --color
最后得知是代码中存在死循环导致的(测试使用,要是想让CPU跑的更满,可以启用自己CPU一致的线程数,分别死循环):
修改代码,解决问题。
注意:
在编写代码时候,注意循环条件推出方式