有一天,我们的Java Web应用程序的CPU使用率高达100%。 重新启动可以解决问题,但不能解决问题,因为问题再次出现后几个小时。 我们怀疑新版本引入了无限循环,但没有对代码或服务器进行任何更改。

我们通过使用kill -QUIT进行了多个线程转储并查看并比较了每个线程的详细信息,从而设法找到了问题。 我们发现一个线程调用堆栈出现在所有线程转储中。 经过分析后,对于数据库中定期更新的某些数据,有一个while循环条件永远不会出错。

对Web应用程序的几个线程转储的分析确实很繁琐。

那么您知道在生产环境中找到这种问题的更好的方法或工具吗?

有帮助吗?

解决方案

经过一些查询,我在监视和管理Java中找到了答案SE 6平台应用程序

您可以使用JDK提供的名为JTop的工具诊断循环线程,该工具将显示每个线程使用的CPU时间:“在此处输入图片说明“

使用线程名,可以通过使用kill -QUIT进行线程转储,在“线程”选项卡中找到该线程的堆栈跟踪。

您现在可以专注于导致无限循环的代码。

PS .:似乎可以根据 http:/回答我自己的问题/blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/ : […] “是的,如果您在其他任何人之前都找到了好的答案,那就可以了,甚至鼓励您回答自己的问题。” […]

PS .:如果sun.com域不再存在: 您可以将JTop作为独立的GUI运行: 通用标签

或者,您可以将其作为JConsole插件运行: 通用标签

其他提示

在出现问题之前解决问题!使用静态分析工具,例如 FindBugs PMD 作为构建系统的一部分。它不会找到所有内容,但这是一个很好的第一步。

请考虑使用Cobertura等覆盖工具。 它将向您显示您没有测试这些代码路径。

测试……这样会变得很麻烦,因此请尝试通过引入质量测量来避免这种情况。

无论如何,VisualVM之类的工具都会为您提供所有线程的概览,因此,识别出异常长时间运行的线程变得相对容易。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top