linux 下排查 CPU 占用过高问题
1. 准备
编写如下 java 类,开启 8 个线程,空转 Cpu
public class CpuTest {
public static void main(String[] args) {
for (int i = 0; i < 8; i++) {
new Thread(){
@Override
public void run() {
while (true) {
int a = 1 / 2;
}
}
}.start();
}
}
}
2. linux 下运行
执行如下命令,生成 class 文件
[luozhihong@localhost java]$ javap CpuTest.java
执行 java 命令,运行程序
[luozhihong@localhost java]$ java CpuTest
3. 问题排查
- 执行 top 命令,查看 cpu 异常的进程
[luozhihong@localhost ~]$ top
可以看出 PID = 3221 的进程,cpu 消耗达 98.7% 以上,是由 java 命令开启的
2.执行 top -Hp pid,查看进程中哪个线程消耗 cpu 严重
[luozhihong@localhost ~]$ top -Hp 3221
从结果可以看出,进程中有8个线程占用 cpu 异常。这里我们找其中的一个线程分析即可
3.执行 printf “0x%x\n”线程PID
[luozhihong@localhost ~]$ printf "0x%x\n"3231
0x0
将线程PID转换为 16进制,为后面查找 jstack 日志做准备
4.执行 jstack 进程PID|vim + /16进制线程PID - ,打印线程堆栈信息
[luozhihong@localhost ~]$ jstack 3221|grep "0x0" -A 90
Thread-7" #15 prio=5 os_prio=0 tid=0x00007f7d6c0cb800 nid=0xca6 runnable [0x00007f7d70286000]
java.lang.Thread.State: RUNNABLE
at CpuTest$1.run(CpuTest.java:12)
从上面很容易看出,哪行代码出现了问
原文地址:https://blog.csdn.net/m0_73774439/article/details/143931227
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!