有时候我们会发现CPU占用率很高,系统日志中也看不出问题所在,那么此时我们就需要区查看以下运行中的线程有没有异常情况。
简单说就是先找到CPU飙升的进程,再找到进程中占用CPU资源最多的线程,通过jstack命令打出这个线程的dump文件,找到具体的代码位置
- 通过
top -c
命令可以动态显示进程占用资源排行榜,包括CPU、内存、占用进行ID。得到的
PID=80972
- 然后再定位到当前进程的哪个线程,通过命令
top -H -p 80972
查找到当前进程中最消耗CPU的线程。PID=81122。
- 通过
printf "0x%x\n" 81122
命令,把对应线程PID转化为16进制。
printf "0x%x\n" 81122 -> 0x13ce2
- 查看当前线程的Dump日志,定位到具体有问题的代码。命令
jstack 80972 | grep -A 20 0x13ce2
从上述内容可以看出,是WhileThread.run方法中,执行的逻辑导致CPU占用过高。