我们发现我们的一个应用程序服务器存在一个有趣的(尽管相当严重)问题:在某个时间点,运行我们的 Web 应用程序的 JVM 的 CPU 使用率开始上升并持续上升,直到应用程序最终变慢爬行。修复它的唯一方法是重新启动应用程序服务器软件。
- 应用服务器:Spring tc Server(由于服务器托管在别处,目前不知 Prop 体版本)
- 应用程序:相对标准的 Spring 3 Web 应用程序(不过我们确实使用了 JVM 内的 EHCache)
这让我想到了一个简单的问题;我们可以做些什么来解决这个问题?
我考虑过使用 VisualVM(或其他一些 JVM 监控工具),但他们能做的最好的事情 - 在这种特殊情况下 - 是给我一个线程转储,它仍然不会告诉我是什么占用了所有 CPU 时间(除非我遗漏了什么)。
最佳答案
您需要了解它在做什么?此问题的一个常见原因是可用内存不足。如果这不是原因,则需要 CPU 分析器。 VisualVM 随 JDK 免费提供,并且可以为您完成这两件事。
only you can't profile the application all the time
发生这种情况时,您可以每隔几秒多次调用 jstack
来进行临时分析。您可以使用堆栈跟踪的 diff
来帮助您找到可能繁忙和消耗 CPU 的线程。
关于java - JVM CPU 峰值故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14602451/