欢迎关注微信公众号:互联网全栈架构
Java程序占用CPU过高,甚至飙升到了100%,应该怎么排查?可以试试如下这三步:
使用top命令找到CPU占用最高的进程;
找到进程对应的线程;
打印堆栈信息,然后进行分析。
准备工作
先写一个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最高的进程:
可以看出,id为2411的进程占用了99%的CPU资源。
第二步:找出进程中的线程
找到进程中的线程:
top -Hp 2411
执行上面的命令,可以得到如下的结果:
线程id为2412占用的CPU最高。然后把2412转换成16进制:
printf '%x\n' 2412
它的结果为96c
第三步:打印线程堆栈信息
使用jstack打印出线程的堆栈信息:
jstack 2411 | grep -A 10 96c
注意,上面的数字2411表示进程id,而96c则是线程id的16进制表示。
执行上面的命令,得到如下的结果:
上面的堆栈信息已经清楚地指出了问题所在,就是在类CpuFullExample的第6行出了问题。
通过这样的方式,可以较为清楚地发现到底是哪里出了问题。
鸣谢:
https://www.jianshu.com/p/a455ac8a3ef0
推荐阅读: