定位 java程序 在Linux系统中cpu占用率100%问题

306 阅读1分钟

模拟故障程序

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(DemoApplication.class, args);

        for (;;){
            Thread thread = new Thread(() -> {
                System.out.println("hello world");
            });
            thread.start();

        }
    }

}

把故障程序上传到空闲服务器

执行命令后台运行,如果直接运行或直接造成 shell连接工具卡顿

nohup java -jar xxx.jar &

使用top 或者htop 命令查看 进程列表

image.png

cpu占用率排在第一位的java进程就是我们运行的故障程序

运行 ps aux |grep PID 进一步确定是什么进程出现了问题

image.png

运行ps -mp PID -o THREAD,tid,time 找到占用cpu最多的线程

image.png

运行 printf "%x\n" TID 将需要的线程ID转换为16进制格式

image.png

最后运行jstack pid |grep TID -A 3 打印线程的堆栈信息

image.png

image.png