简单的线上CPU100%排查

Posted by YM on February 12, 2019

引言

在招聘面试过程中,时不时会遇到“CPU100%异常警告,如何定位问题所在?”的面试问题。接下来给出简单的问题排查过程,以后再给出详细的排查过程。

  • 查找消耗CPU最高的进程PID
  • 根据PID查找消耗CPU最高的线程号TID
  • 根据线程号TID找到对应的Java线程,进行处理。

实际问题

在Intellij IDEA中运行一段死循环程序,如下

public class Main {
    public static void main(String[] args) {
        int random = 0;
        while(random<100){
            random = random*10;
        }
    }
}

此时,打开任务管理器可以发现CPU飙升。

问题排查过程

查找消耗CPU最厉害的进程PID

在任务管理器中显示PID栏,然后找到消耗CPU最多的进程,从图中可以发现是PID=11156

根据PID查找出消耗CPU最高的线程TID

这里用到微软的工具Process Explorer,点击超链接可直达下载地址。

如图查找到线程号TID=17152,然后用十六进制表示为0x4300

根据线程号查出对应的java线程,进行处理

在windows系统的cmd窗口中输入以下命令,打印进程的相关信息。

jstack -l 11156 > g:/11156.stack

打开g:/11156.stack文件,查找十六进制表示的线程号0x4300,如下图

根据文件就可以看出,Main.java文件中第20行一直在跑,至此定位到问题。