java服务cpu占用超100%的问题定位

java服务cpu占用超100%的问题定位
最新回答
别闹~乖

2021-08-23 17:34:17

Java服务CPU占用超100%的问题定位

在Linux服务器中,当Java服务的CPU占用超出正常值时,定位问题所在通常可以通过以下三个步骤来实现:

1、使用top命令找到CPU占用超高的Java进程

首先,使用top命令来查看当前系统中各个进程的CPU占用情况。在top命令的输出中,可以找到一个CPU占用率异常高的Java进程。例如,假设某个Java进程的CPU占用率为195%,PID(进程ID)为18720。

2、通过PID找到该进程耗用CPU最大的线程

接下来,需要确定是哪个线程导致了Java进程的CPU占用率异常高。可以使用top -H -p 进程PID命令来查看该Java进程下所有线程的CPU占用情况。在这个例子中,使用top -H -p 18720命令。

从输出中,可以看到有两个线程的CPU占用率不正常。先选择其中一个线程进行进一步分析,例如线程PID为18745。为了后续操作方便,需要将这个线程PID转换成16进制。

使用printf '0x%xn' 线程PID命令进行转换,例如printf '0x%xn' 18745,得到16进制的线程PID:0x4939。

3、通过jstack命令查看具体线程的问题代码

最后,使用jstack命令来查看Java进程的线程堆栈信息,并定位到出问题的代码。jstack命令的输出中包含了Java进程中所有线程的堆栈信息。为了找到特定的线程,可以使用grep命令来过滤出包含16进制线程PID的行,并显示其前后的几行信息(通常20行足够)。

使用jstack 进程PID | grep 16进制线程PID -A 20命令,例如jstack 18720 | grep 0x4939 -A 20。

从输出中,可以看到出问题的代码所在。通常,这个输出会包含线程的状态、正在执行的Java方法以及相关的源代码行号(如果编译时包含了调试信息)。

总结

通过以上三个步骤,可以定位到导致Java服务CPU占用超100%的具体线程和代码位置。一旦找到了问题所在,就可以根据具体情况进行相应的优化或修复。例如,如果是由于某个算法的时间复杂度过高导致的CPU占用率高,可以考虑优化算法;如果是由于资源竞争或死锁导致的CPU占用率高,可以考虑调整线程的使用方式或增加资源等。