自学内容网 自学内容网

linux 下排查 CPU 占用过高问题

1. 准备

  编写如下 java 类,开启 8 个线程,空转 Cpu

public class CpuTest {
    public static void main(String[] args) {
        for (int i = 0; i < 8; i++) {
            new Thread(){

                @Override
                public void run() {
                    while (true) {
                        int a = 1 / 2;
                    }
                }
            }.start();
        }
    }
}

2. linux 下运行

  执行如下命令,生成 class 文件

[luozhihong@localhost java]$ javap CpuTest.java

执行 java 命令,运行程序

[luozhihong@localhost java]$ java CpuTest

3. 问题排查

  1. 执行 top 命令,查看 cpu 异常的进程
    [luozhihong@localhost ~]$ top
    

        可以看出 PID = 3221 的进程,cpu 消耗达 98.7% 以上,是由 java 命令开启的

2.执行 top -Hp pid,查看进程中哪个线程消耗 cpu 严重

[luozhihong@localhost ~]$ top -Hp 3221 

 

        从结果可以看出,进程中有8个线程占用 cpu 异常。这里我们找其中的一个线程分析即可

3.执行 printf “0x%x\n”线程PID

[luozhihong@localhost ~]$ printf "0x%x\n"3231 
0x0    

 将线程PID转换为 16进制,为后面查找 jstack 日志做准备

4.执行 jstack 进程PID|vim + /16进制线程PID - ,打印线程堆栈信息

[luozhihong@localhost ~]$ jstack 3221|grep "0x0" -A 90
Thread-7" #15 prio=5 os_prio=0 tid=0x00007f7d6c0cb800 nid=0xca6 runnable [0x00007f7d70286000]
   java.lang.Thread.State: RUNNABLE
        at CpuTest$1.run(CpuTest.java:12)

从上面很容易看出,哪行代码出现了问


原文地址:https://blog.csdn.net/m0_73774439/article/details/143931227

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!