CPU飙升至100%!别慌,试试这个锦囊

欢迎关注微信公众号:互联网全栈架构

Java程序占用CPU过高,甚至飙升到了100%,应该怎么排查?可以试试如下这三步:

  1. 使用top命令找到CPU占用最高的进程;

  2. 找到进程对应的线程;

  3. 打印堆栈信息,然后进行分析。

准备工作

先写一个Java程序,频繁地进行计算:

package com.sample.core.cpu;

public class CpuFullExample {
    private static final int times = 100000000;
    public static void main(String[] args) {
        for (int i = 0; i < times; i++) {
            Math.pow(2, i);
        }
    }
}

然后运行上面的程序,当然,请在Linux系统中运行:

java com.sample.core.cpu.CpuFullExample

第一步:找出进程

运行top命令,找到占用CPU最高的进程:

baa10cad6030e1a456dcfec0edaaca78.png

可以看出,id为2411的进程占用了99%的CPU资源。

第二步:找出进程中的线程

找到进程中的线程:

top -Hp 2411

执行上面的命令,可以得到如下的结果:

76cca92f94549cfa24cfdfc853a89b4e.png

线程id为2412占用的CPU最高。然后把2412转换成16进制:

printf '%x\n' 2412

它的结果为96c

第三步:打印线程堆栈信息

使用jstack打印出线程的堆栈信息:

jstack 2411 | grep -A 10 96c

注意,上面的数字2411表示进程id,而96c则是线程id的16进制表示。

执行上面的命令,得到如下的结果:

8e13c53a5cc1ed175fca3fc669044385.png

上面的堆栈信息已经清楚地指出了问题所在,就是在类CpuFullExample的第6行出了问题。

通过这样的方式,可以较为清楚地发现到底是哪里出了问题。

鸣谢:

https://www.jianshu.com/p/a455ac8a3ef0

推荐阅读:

图解MySQL中的各种JOIN:再也不用担心记不住了

初级工程师一脸懵逼,高级工程师笑而不语

数据同步的利器:Canal

拒绝空谈:实例演示MySQL事务隔离级别

聊聊MySQL中的死锁

越俎代庖:应用广泛的代理模式

MySQL整数类型的长度到底是什么含义?

漫谈MySQL中的事务

臭名昭著,怙恶不悛的OOM,到底是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值