使用jstack排查CPU飙升的问题记录
最近,看到短视频传播了一个使用jstack来协助排查CPU飙升的案例。我也是比较感兴趣,参考了视频博主的流程,自己做了下对应案例的实战演练,在此,想做一下,针对相关问题模拟与排查演练的实战过程记录。
案例中所使用的DEMO代码,我已经放到了以下的代码仓库中,有需要的同学,可以自行下载与学习演练。代码仓库地址:https://github.com/AlickLiubc/cpu-problems-demo
在演练代码中,主要通过一段死循环,来模拟了系统CPU飙升的代码原因。
具体步骤:
步骤1:
将代码打成jar包并放置在Linux的系统运行环境中运行:
mvn clean package -DskipTests
nohup java -jar cpu-problems-demo-1.0-SNAPSHOT.jar > /dev/null 2> /dev/null &
步骤2:
通过浏览器打开与观察接口的问题现象,如下图所示,浏览器处于不断加载的过程中:
步骤3:
使用top命令,查看占用CPU比较高的进程ID(十进制),可以看到PID=16013的进程占用CPU很高。
top
步骤4:
进一步使用top命令查询占用CPU比较高的线程ID
top -H -p 16013
此时,可以得到占用CPU很高的线程ID(十进制),PID=16029。
步骤5:
将步骤4中得到的十进制的线程ID转换为十六进制值为0x3e9d:
printf "0x%x\n" 16029
步骤6:
结合以上步骤中得到的进程ID(十进制)与线程ID(十六进制),可以找到问题源头的相关代码信息:
jstack 16013 | grep 0x3e9d-A 20