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

Jas*_*per 36 java performance multithreading web-applications cpu-usage

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

所以要调查:

我使用Thread Dump来查找线程正在做什么.在'RUNNABLE'州中发现了几个线程,在少数其他状态中发现了一些线程.在重复的线程转储中,我确实看到一些始终存在于'RUNNABLE'状态中的线程.所以,他们似乎是罪魁祸首.

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

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

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

eri*_*son 41

如果分析器不适用于您的设置,您可以尝试在此帖子中的步骤之后识别该线程.

基本上,有三个步骤:

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

  • 我怎样才能在 Windows 上实现同样的目标? (2认同)
  • http://web.archive.org/web/20190403090107/http://code.nomad-labs.com/2010/11/18/identifying-which-java-thread-is-consuming-most-cpu/ (2认同)

Ale*_*cob 13

您可能是垃圾收集问题的受害者.

当你的应用程序需要内存并且它的配置使用时,垃圾收集器的运行频率会降低,这会占用大量的CPU周期.如果它无法收集任何东西,你的记忆力会保持低水平,所以它会一次又一次地运行.重新部署应用程序时,内存将被清除,垃圾收集不会超过所需的次数,因此CPU利用率会保持低水平,直到它再次满.

您应检查应用程序中是否存在可能的内存泄漏,并且已为内存配置良好(请查看-Xmx参数,请参阅Java选项-Xmx代表什么?)

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


ran*_*b14 5

在线程转储中,您可以找到如下行号。

对于当前正在运行的主线程...

"main" #1 prio=5 os_prio=0 tid=0x0000000002120800 nid=0x13f4 runnable [0x0000000001d9f000]
   java.lang.Thread.State: **RUNNABLE**
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:313)
    at com.rana.samples.**HighCPUUtilization.main(HighCPUUtilization.java:17)**
Run Code Online (Sandbox Code Playgroud)