有一天,我们的
Java Web应用程序的cpu使用率达到100%.
重启解决了事件但不是问题,因为问题回来几个小时后.
我们怀疑新版本引入了无限循环,但我们没有对代码或服务器进行任何更改.
重启解决了事件但不是问题,因为问题回来几个小时后.
我们怀疑新版本引入了无限循环,但我们没有对代码或服务器进行任何更改.
我们设法通过使用kill -QUIT进行多次线程转储并查看和比较每个线程详细信息来找到问题.
我们发现一个线程调用堆栈出现在所有线程转储中.
经过分析,有一个while循环条件,对于在数据库中定期更新的某些数据,它永远不会出错.
分析Web应用程序的几个线程转储非常繁琐.
那么您是否知道在生产环境中找到此类问题的更好方法或工具?
解决方法
经过一些询问后,我在
Monitoring and Managing Java SE 6 Platform Applications找到了答案:
您可以使用JDK提供的名为JTop的工具来诊断循环线程,该工具将显示每个线程使用的cpu时间:
使用线程名称,您可以通过使用kill -QUIT进行线程转储,在“线程”选项卡中找到此线程的堆栈跟踪.
您现在可以专注于导致无限循环的代码.
PS.:根据http://blog.stackoverflow.com/2008/07/stack-overflow-private-beta-begins/回答我自己的问题似乎没问题:
[…]
“是的,如果你能在别人面前找到一个好的答案,那就可以回答你自己的问题了.”
[…]
PS.:如果sun.com域名将不再存在:
您可以将JTop作为独立的GUI运行:
$<JDK>/bin/java -jar <JDK>/demo/management/JTop/JTop.jar
或者,您可以将其作为JConsole插件运行:
$<JDK>/bin/jconsole -pluginpath <JDK>/demo/management/JTop/JTop.jar