1、搭建CentOS 7.9,部署JDK 8:

Java应用导致CPU使用率过高的排查方法_CPU使用率高

2、编写测试代码Test.java:

public class Test {
    public static void main(String[] args) {
        System.out.println("测试死循环对CPU的影响");
        while (true){
        }
    }
}

Java应用导致CPU使用率过高的排查方法_java应用_02

3、编译Test.java:

# javac Test.java

Java应用导致CPU使用率过高的排查方法_ps_03

4、运行Test程序:

# java Test

Java应用导致CPU使用率过高的排查方法_java应用_04

5、新开一个Shell窗口,使用top命令,按c键,降序查看CPU使用率:

Java应用导致CPU使用率过高的排查方法_java应用_05

6、查看进程PID下的线程详情:ps H -eo pid,tid,%cpu | grep 进程PID

# ps H -eo pid,tid,%cpu | grep 3698

Java应用导致CPU使用率过高的排查方法_CPU使用率高_06

7、将线程的TID值转化为16进制格式:printf '0x%x\n' 线程TID

# printf '0x%x\n' 3699

Java应用导致CPU使用率过高的排查方法_top_07

8、使用jstack命令查看指定进程的当前时刻的线程快照:jstack 进程PID | grep -A 20 16进制线程TID

# jstack 3698 | grep -A 20 0xe73

Java应用导致CPU使用率过高的排查方法_top_08

说明:直接定位到了Test.java第四行代码的位置,即while死循环位置,修改代码并重新编译运行,就可解决此死循环导致的CPU占用率高的问题。