传统方式排查
模拟CPU飙高的场景
Linux环境上运行测试Demo,模拟CPU飙高的场景
@RequestMapping("testCpu")
public String testCpuCpuSurgesOperation(){
// 模拟占用CPU资源操作
while (true){
}
}
top命令查找占用CPU高的进程
项目启动后,调用testCpu接口,通过top查看进程占用cpu情况,由下图可知进程号为15565的进程占用100.3%的CPU资源
根据进程号找到占用CPU高的线程
top -Hp -15565 找到进程中占用CPU高的线程
线程的转储信息输出到文件中
jstack -l 15565 >> stackdump.txt 用于生成线程转储信息的命令,并将其追加到名为 stackdump.txt 的文件中。
jstack 是一个 Java 命令行工具,用于生成 JVM中所有线程的转储信息。
-l 选项表示生成详细的线程转储信息,包括锁信息。
15565 是要生成线程转储的进程ID。
>> 是重定向操作符,用于将输出追加到指定的文件中。
线程id转为为16进制
使用printf “%x\n” 线程id将异常线程id转化为16进制
线程转储文件中找到对应的线程
打开线程转储文件(stackdump.txt),通过上面输出的16进制的线程i