如何在java web应用程序中找到无限循环?

如何在java web应用程序中找到无限循环?,java,infinite-loop,thread-dump,Java,Infinite Loop,Thread Dump,有一天,我们的java web应用程序的CPU使用率达到了100%。 重新启动可以解决事件,但不能解决问题,因为问题出现几个小时后。 我们怀疑新版本引入了无限循环,但我们没有对代码或服务器进行任何更改 通过使用kill-QUIT进行几个线程转储,并查看和比较每个线程的详细信息,我们成功地找到了问题。 我们发现一个线程调用堆栈出现在所有线程转储中。 经过分析,对于数据库中定期更新的某些数据,存在一个while循环条件,该条件永远不会出错 对web应用程序的几个线程转储的分析真的很乏味 那么,您知道

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

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

对web应用程序的几个线程转储的分析真的很乏味


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

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

考虑使用Cobertura等覆盖工具。 它会告诉您,您没有测试这些代码路径

像这样的测试可能会变得非常麻烦,所以尝试通过引入质量测量来避免这种情况


无论如何,像VisualVM这样的工具将为您提供所有线程的一个很好的概览,因此,识别那些工作时间出乎意料地长的线程变得相对容易。

在一些查询之后,我在以下方面找到了答案:

您可以使用JDK提供的名为JTop的工具诊断循环线程,该工具将显示每个线程正在使用的CPU时间:

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

现在,您可以关注导致无限循环的代码

注:根据以下内容回答我自己的问题似乎没问题: […] “是的,如果你比别人先找到一个好的答案,那么回答你自己的问题是可以的,甚至是被鼓励的。” [……]

注:如果sun.com域不再存在: 您可以将JTop作为独立GUI运行:

$ <JDK>/bin/java -jar <JDK>/demo/management/JTop/JTop.jar
$/bin/java-jar/demo/management/JTop/JTop.jar
或者,您可以将其作为JConsole插件运行:

$ <JDK>/bin/jconsole -pluginpath <JDK>/demo/management/JTop/JTop.jar 
$/bin/jconsole-pluginpath/demo/management/JTop/JTop.jar

可能重复的问题很难找到这样一个特定问题的完全重复;-)我不认为这是一个骗局,特别是因为他的自我回答发现监控软件对他有帮助。代码覆盖率是不够的。即使我们有100%的代码覆盖率,它也取决于字符串参数的值。请不要直言不讳,但我可以提出这样的论点,那时候你的测试是不够的。这与其说是对您的测试实践的批评,不如说是建议您使用这样的环境来改进它们。你刚刚知道过去的假设是错误的。你现在需要测试来揭示这个假设的条件。@yock:你在回答Frank吗?如果是这样,我看不出有什么联系。是的,良好的测试可能会发现无限循环。但是100%的测试覆盖率并不一定意味着好的测试,因此纯代码覆盖率不是衡量测试质量的有效方法。我有什么遗漏吗?我是在回答弗兰克,是的。代码覆盖率本身对任何事情都没有太大的用处,只能让管理层相信您正在生产一些东西。覆盖率只是一个衡量指标。但它足以告诉您代码的哪些部分已经过测试,哪些还没有。如果您已经对此进行了测试,则不需要任何覆盖工具,也不需要检查生产中的无限循环:-)另请参阅为什么您不能始终确定程序是否将退出。仅供参考FindBugs和PMD没有找到任何内容。