我有一个Java应用程序(基于web),它有时会在几个小时内显示非常高的CPU利用率(几乎90%)。Linux的TOP
命令显示了这一点。在应用程序重新启动时,问题就消失了。
So调查
我使用线程转储来找出线程在做什么。有几个线程处于'RUNNABLE'
状态,还有一些处于其他几种状态。在进行重复的线程转储时,我确实看到一些线程始终处于'RUNNABLE'
状态。因此,他们似乎是罪魁祸首。
但是我不能确定是哪个线程占用了CPU,还是进入了无限循环(从而导致CPU利用率过高)。
日志不一定有帮助,因为违规代码可能不会记录任何内容。
如何调查-应用程序的哪个部分或什么-线程导致高CPU利用率?-还有其他想法吗?
发布于 2013-04-04 23:45:53
如果探查器在您的设置中不适用,您可以尝试按照this post中的步骤识别线程。
基本上,有三个步骤:
top -H
并获取具有最高CPU的线程的PID。发布于 2013-04-04 21:11:42
您可能是垃圾收集问题的受害者。
当您的应用程序需要内存,并且它的配置使用量越来越少时,垃圾收集器将经常运行,这将消耗大量CPU周期。如果它不能收集任何东西,你的内存就会很低,所以它会一次又一次地运行。当您重新部署应用程序时,内存将被清除,垃圾收集不会超过所需的次数,因此CPU利用率将保持在较低水平,直到再次填满为止。
您应该检查应用程序中是否存在可能的内存泄漏,以及是否为内存进行了良好的配置(请检查-Xmx
参数,请参阅What does Java option -Xmx stand for?)
另外,你使用什么作为web框架?JSF在很大程度上依赖于会话,并且消耗大量内存,最好是无状态的!
发布于 2015-05-29 14:50:03
在线程转储中,您可以找到行号,如下所示。
对于当前正在运行的主线程...
"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)**
https://stackoverflow.com/questions/15811411
复制相似问题