1:首先写一个SpringBoot项目,定义下面这个组件,因为实现了ApplicationRunner这个接口的组件,在SpringBoot启动之后会运行run方法
@Component
public class CpuDemo implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
//这里是一个死循环
while (true) {
Random random = new Random();
System.out.println(random.nextInt());
}
}
}复制代码
2:部署这个项目到linux机器,然后执行 top 命令,发现16970这个进程占用的cpu很高
3:执行 top -Hp 16970,这个命令可以查看到16970这个进程中线程占用的cpu,发现是16971这个线程占用的cpu高
4:将这个线程的PID转换一下 printf %x 16971 会输出一个字符串,记住这个字符串
5: 执行命令 jstack 16970 -> 1.txt 将16970这个进程的信息输出到1.txt文件中
6:查看16971哪个线程的具体执行信息
这个424b就是在第4步得到的那个字符串
[root@bigdata01 ~]# cat 1.txt | grep -A 30 424b复制代码
7:最后发现这个线程占用cpu高的原因是执行了com.example.demo.CpuDemo.run方法,因为再开始的这个方法我们写了一个死循环