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

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

不好啦!不好啦!老大,你快看下,线上服务器报警,CPU使用率飙高至100%,所有业务接口都在转圈圈,该怎么办呐?!

正准备下班的我突然一脸懵地按在工位上开始进行问题排查(文中自己起了一个简单的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 14806

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

printf %x 14087

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

jstack 14086 | grep -a10 3707

jstack 14086
这样我们就得到了该线程当前状态为: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,那就开动小脑瓜给他修复了呗!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值