Java 应用程序中的高 CPU 利用率 - 为什么?

我有一个Java应用程序(基于Web),有时在几个小时内显示出非常高的CPU利用率(近90%)。Linux 命令显示了这一点。重新启动应用程序时,问题消失。TOP

所以要调查

我使用线程转储来查找线程正在做什么。在状态下可以找到几个线程,一些在其他几个状态中。在进行重复的线程转储时,我确实看到一些始终处于状态的线程。因此,他们似乎是罪魁祸首。'RUNNABLE''RUNNABLE'

但是我无法确定哪个线程正在占用CPU或进入无限循环(从而导致高CPU利用率)。

日志不一定有帮助,因为违规代码可能没有记录任何内容。

如何调查 - 应用程序的哪个部分或哪个线程导致 CPU 使用率过高?- 还有其他想法吗?


答案 1

如果探查器不适用于您的设置,您可以尝试按照本文中的步骤确定线程。

基本上,有三个步骤:

  1. 运行并获取具有最高 CPU 的线程的 PID。top -H
  2. 将 PID 转换为十六进制。
  3. 在线程转储中查找具有匹配的十六进制 PID 的线程。

答案 2

您可能是垃圾回收问题的受害者。

当您的应用程序需要内存并且它配置为使用垃圾回收器的内容越来越少时,垃圾回收器将经常运行,这会消耗大量的CPU周期。如果它无法收集任何东西,您的内存将保持低位,因此它将一次又一次地运行。重新部署应用程序时,将清除内存,并且垃圾回收不会超过所需的次数,因此 CPU 利用率保持在较低水平,直到再次填满。

您应该检查应用程序中是否存在可能的内存泄漏,以及它是否为内存进行了良好的配置(检查参数,请参阅Java选项-Xmx代表什么?-Xmx)

另外,你用什么作为Web框架?JSF非常依赖会话并消耗大量内存,考虑最多是无状态的!


推荐