文章目录
- 拿到CPU占用高的进程ID
- 通过进程ID拿到CPU占用高的线程ID
- 将线程ID转换为十六进制
- jstack分析线程栈信息
CPU占用过高的时候要先找出到底是哪个进程下的线程占用内存过高了。
我在线上预先写了一个Java程序,Test.java用于本篇文章实验所用。模拟CPU占用过高时的具体情况。
拿到CPU占用高的进程ID
top -c
我们发现Java程序Test,进程ID为 22912的进程占用CPU是最高的!
接下来我们根据得到的进程ID拿到CPU占用过高的线程ID。
通过进程ID拿到CPU占用高的线程ID
通过命令:
ps H -eo pid,tid,%cpu | grep 39855
可以发现,线程ID为39856的线程占用CPU是最高的。
将线程ID转换为十六进制
printf "%x\n" 39856
jstack分析线程栈信息
jstack 88667 | grep 15a5c -A20
-
其中88667是进程ID
-
15a5c是线程ID转换为十六进制以后得结果
追根溯源,查看代码第四行:
原来就是while循环导致CPU占用过高!