JVM虚拟机(十一)CPU飙高的排查方案与思路

时间:2024-04-24 14:37:50

目录

    • 一、排查方案与思路
    • 二、总结

一、排查方案与思路

1.一般我们查看 CPU 的使用情况,可以使用 TOP 命令:

top

执行结果如下所示,这里就可以按照 CPU 使用率进行排序。

在这里插入图片描述

2.通过 top 命令查看后,可以查看是哪一个 Java 进程占用 CPU 较高,上图所示的进程为:2266,CPU 的使用率是 90%,也就是接近占用了 1核的 CPU。

接下来,我们就需要定位到项目中具体是哪一行代码导致的这个问题。我们项目中这么多代码,该怎么排查呢?其实我们项目中的代码虽然多,但都是在线程中运行的,我们只需要找到对应的线程就能去定位这个问题了。

获取当前进程中的线程,我们可以使用如下命令:

ps H -eo pid,tid,%cpu | grep <pid>

执行结果如下所示:

这个执行结果中就展示了当前进程中所有线程占用 CPU 的情况了。可以看到,其中倒数第 2 个线程占用的 CPU 使用率比较高,这个就是我们要找的线程了。

然后我们还没有办法直接去查线程的情况,需要先使用之前介绍过的 jstack 命令来继续查看进程对应的线程情况:

jstack <pid>

执行之后,就会把当前进程对应的所有线程打印出来:

在这里插入图片描述

但是这么多线程,我们怎么才能找到具体是哪一个线程出了问题呢?我们还需要进一步地进行筛选。

刚才我们已经通过 ps 命令找到了 2276 线程消耗的 CPU 使用率比较高。这里面的 2276 是一个十进制的数字,我们使用 jstack 打印的线程ID 都是十六进程的,所以说我们需要进行一次转换:将十进制转换成十六进制。Linux 命令就可以支持,我们可以执行如下命令:

printf "%x\n" 2276

执行结果:

这样我们就得到了十六进制的线程ID,然后我们再根据 8e4 去刚才使用 jstack 命令打印的线程信息中进行查找:

在这里插入图片描述

找到对应的线程信息后,我们从线程信息中可以看出,在 Application.java 类中的第 9 行出现了问题。来到具体的代码中,我们可以看到:

代码中进行了一个死循环轮询,这就是导致 CPU 飙升的原因。


二、总结

CPU飙高的排查方案和思路:

  1. 通过 top 命令查看占用 cpu 的情况。
  2. 通过 top 命令查看后,可以查看是哪一个进程占用 cpu 较高。
  3. 使用 ps 命令查看进程中的线程信息。
  4. 使用 jstack 命令查看进程中哪些线程出现了问题,最终定位问题。

整理完毕,完结撒花~????