【发布时间】:2013-03-26 12:56:44
【问题描述】:
我有一个 Java 应用程序(基于 Web),它有时会在几个小时内显示非常高的 CPU 利用率(几乎 90%)。 Linux TOP 命令显示了这一点。应用程序重新启动后,问题就消失了。
所以要调查:
我使用 Thread Dump 来查找线程在做什么。在'RUNNABLE' 状态下发现了几个线程,一些在其他几个状态下。在进行重复的线程转储时,我确实看到了一些始终处于'RUNNABLE' 状态的线程。所以,他们似乎是罪魁祸首。
但我无法确定是哪个线程占用了 CPU 还是进入了无限循环(从而导致 CPU 利用率过高)。
日志不一定有帮助,因为有问题的代码可能没有记录任何内容。
我该如何调查 - 应用程序的哪个部分或哪个线程导致 CPU 使用率过高? - 还有其他想法吗?
【问题讨论】:
-
您是否已经尝试过探查器?
-
您的线程转储还应该显示在线程转储期间这些可运行线程在代码中的位置。你需要在你的代码中查看那里。 IIRC“可运行”线程可能正在等待 I/O 而不会占用 CPU,但现在还早,我还在喝咖啡。
-
andreapier> 虽然我可能无法在 Prod 环境中使用 Profiler,但 Profiler 会告诉哪个线程占用 CPU?
-
您是否在相似的代码行上看到了许多可运行文件?如果是这样,您可以通过公共行的线程转储吗?
标签: java multithreading performance web-applications cpu-usage