模拟环境
新建一个SpringBoot,简单写一个死循环接口
问题排查
1、触发接口,在linux下使用top命令查看当前占用cpu最多的进程
top
2、按q退出,可以知道占用cpu最高的进程pid是205947,然后使用top -Hp [pid],获取该进程下占用cpu最高的线程。
top -Hp 205947
3、占用最高的线程号的205964,把它转成16进制,后面会用到,因为日志打印的线程号是16进制的。
printf "%x\n" 205964
4、因为是java程序,我们可以通过jstack,把进程的线程栈给dump下来。而进程的pid我们第一步就获取到了205947(第二步是通过进程pid获取到线程)
jstack 205947 > 205947.dump
把java进程的所有线程信息都dump到一个文件,下载到本地去分析里面的信息
5、第4步获取的信息是所有线程的,而我们在第3步的时候就知道了出问题的线程,所有只要在文件里面去找问题线程的线程栈信息就可以了。通过在日志去找16进制的线程号,找到cpu飙高时,线程在执行哪行代码,然后分析问题,修改问题。
注意
最后别忘了kil -9 pid,把这个进程杀掉,毕竟很占cpu。