您的位置 首页 java

Java进程导致CPU使用率飙升的问题排查

正准备下班的我突然一脸懵地按在工位上开始进行问题排查(文中自己起了一个简单的 java 进程demo进行演示)。

首先,我们需要确认的是哪个进程导致了 CPU 的使用率一直居高不下,这里我们可以使用linux命令:top 查看整个系统的进程运行状态:

top命令查看进程运行状态

如上图所示,通过该命令我们可以看到各个进程的PID以及它们对应的CPU、内存的占用情况。默认情况下,所展示的信息是以CPU及内存使用率的大小从高到低进行排序的。从这里我们找到导致CPU使用率100%进程的PID,然后进行接下来的操作。

通过前一步操作,我们确认导致系统CPU打满的进程是一个Java进程,其PID为14086,那现在我们知道了问题进程的 PID ,那怎么进一步确认是该进程中的哪个线程的哪个操作导致的该问题呢?废话不多说,先上命令:

 top -H -p 14086  

这条命令中的-H是以线程模式查看,-p用来指定进程PID,整个命令意思就是以线程模式查看14086进程的具体运行信息:

查看指定进程中线程运行情况

这样我们便确定了,14086进程中的进程id为14087的线程所执行的代码出现了问题,那么,接下来我们就需要使用到java内置的一些命令进行具体的问题排查了,具体使用到的java的就jstack命令就足够了,不过如果使用jstack命令直接查看整个java进程的信息,我们看到的结果是这样的:

 jstack 14086  

问题来了,哪个才是我们上面找到的进程号为14087线程的运行信息呢?其实,也很简单,jstack查看到的nid是十六进制表示的进程号,我们只需要将14087转换为十六进制表示的不就可以匹配到了吗?那怎么快速将十 进制 的14087转为十六进制表示呢?哈哈,看法宝:

 printf %x 14087  

对,就是这个命令,可以直接获取到14087的十六进制表示(其他还有N多种方式,自行查找即可),这里我们通过命令得到的结果是:3707,然后,结合jstack命令就可以精确找到该线程当前的运行信息:

 jstack 14086 | grep -a10 3707  

这样我们就得到了该 线程 当前状态为:RUNNABLE,所执行代码为Test类下的main()方法,具体是在 Test .java 的第10行:

 import com.example

/**
 * Test 测试类
 * @Date: 2021/9/1 12:39 下午
 */
public class Test {

    public static void main(String[] args) {
        while (true){
            int a=1; 
        }
    }
}  

哦豁,原来是一个while(true)的代码块导致的啊(这个只是用来演示的代码,线上问题是因为一段递归调用导致的),接下来怎么解决,应该就不用我再继续说了吧,哈哈,找到了bug,那就开动小脑瓜给他修复了呗!

文章来源:智云一二三科技

文章标题:Java进程导致CPU使用率飙升的问题排查

文章地址:https://www.zhihuclub.com/179004.shtml

关于作者: 智云科技

热门文章

网站地图