一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。
如果你嫌麻烦,我也强烈推荐阿里开源的问题定位神器 arthas 来定位问题。
简单步骤:
1、定位CPU高的进程
首先利用 top -c
将系统资源使用情况实时显示出来 (-c
参数可以完整显示命令)。
接着输入大写 P
将应用按照 CPU
使用率排序,第一个就是使用率最高的程序。
通过ps aux | grep PID
命令,可以进一步确定是哪个进程出现了问题。
2、定位最耗CPU的线程
常规操作第二步自然是得知道这个应用中最耗 CPU
的线程到底再干嘛。
利用 top -Hp pid
然后输入 P
依然可以按照 CPU
使用率将线程排序。
或
ps -mp 22143 -o THREAD,tid,time|sort -k1 -nr|head -15
找到最耗时的线程
3、获取线程的十六进制码
将需要的线程ID转换16进制格式,printf "%x\n" tid
4、查看堆栈,找到线程在干嘛
追踪线程内部,查看load过高原因。
通过命令:jstack 25245 >>/usr/log.txt
文件,将线程堆里面的信息全部保存下来
或
直接打印线程的堆栈信息:jstack pid |grep tid -A 30
5、定位具体代码位置
找到问题,分析代码