Java程序中出现大量CPU消耗问题的排查

项目中可能会出现消耗大量 CPU 的情况(如下图),当我们发现这种情况应该怎么排查呢?

image-20230521232200245

top

首先使用top命令查看所有运行的进程占用资源的情况。可以看到上图中PID为14646的Java进程的CPU使用率达到了799.6%,这明显是有问题的。那我们应该怎么定位那一段代码出问题了呢?

jstack -p pid

使用 top命令可以得到进程的PID,上述Java程序的PID是14646,我们运行JDK自带的命令jstack命令 dump 正在运行的Java进程堆栈。(如下图)

image-20230521230107816

我们根据top命令看到的线程的id(十进制)转为 十六进制,然后在上图中找到对应的堆栈,然后根据堆栈找到代码中的行号。

这个简单的例子演示了jstack -p pid 的使用方法以及生产环境中排查死锁、死循环等问题。