怎么解决线上CPU100%的问题

怎么解决线上CPU100%的问题

背景

Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下几个步骤。

解决步骤

  1. 找到最耗CPU的进程
    top
  2. 找到这个进程中最耗CPU的线程
top -Hp ${进程的PID}
  1. 查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码
printf "%x\n" 2611 

jstack 2601 | grep a33 -A 20
  1. 生成异常进程的dump文件
    jmap -dump:live,format=b,file=./heapdump.hprof 32695
  2. 使用VisualVM查看

快速解决
wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads
chmod +x show-busy-java-threads

实例代码

public class CpuUseTest {
 
    public static void main(String[] args) {
        new Thread() { 
            public void run() {
                int result = 0;
                while (true) {
                    result++;
                    if (result > Integer.MAX_VALUE / 2) {
                        result = 0;
                    }
                }
            }
        }.start();
    }
}

编译

javac

执行

java 类名

打印堆栈信息

当然更常见的是我们对整个jstack文件进行分析,通常我们会比较关注WAITING和TIMED_WAITING的部分,BLOCKED就不用说了。我们可以使用命令cat jstack.log | grep “java.lang.Thread.State” | sort -nr | uniq -c来对jstack的状态有一个整体的把握,如果WAITING之类的特别多,那么多半是有问题啦。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值