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很高

top+jstack定位cpu过高问题_top+jstack

3:执行 top -Hp 16970,这个命令可以查看到16970这个进程中线程占用的cpu,发现是16971这个线程占用的cpu高

top+jstack定位cpu过高问题_top+jstack_02

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复制代码

top+jstack定位cpu过高问题_top+jstack_03

7:最后发现这个线程占用cpu高的原因是执行了com.example.demo.CpuDemo.run方法,因为再开始的这个方法我们写了一个死循环