我们有一个生产Web应用程序似乎有一个线程卡住做一堆工作,并运行CPU和平均负载。我几乎知道问题是什么 - 我们的DWR服务正在将极大的东西转换为Javascript对象响应。问题是我不知道哪个服务调用产生了大量数据,因为该线程在我的任何代码之外(它在DWR servlet中将我的返回值转换为出站javascript对象...否则我可以在线程转储中查看我的服务方法。
你不需要知道DWR来帮助我,因为我的问题是:
这是否可以让我查看部署的Web应用程序(Tomcat 6)并查看线程所处的状态,例如变量值等?如果我基本上可以接受线程的“调试快照”,就好像我在本地开发期间在调试模式下有一个断点那样,那将是完美的,但任何让我看到或打印出某些东西值的解决方案都会很有用。
谢谢!
更新
如果有可能不重新启动服务器,那将是最好的,因为这个问题每隔一段时间才出现一次,重新启动会使问题消失。看起来像JProfiler需要将-agentpath
选项添加到JVM,所以我需要重新启动它。
答案 0 :(得分:4)
是的,您可以附加Visual VM 1.3.2,下载并安装所有插件,以查看每个线程的状态,堆中的代数等。
答案 1 :(得分:0)
您可以在eclipse中打开源并附加远程调试器。它与任何其他Java应用程序没有什么不同。 Remote Debugging Article。您可以在应用程序中插入断点并随意暂停线程。
另一种选择是像JProfiler,Yourkit或VisualVM这样的分析器。此工具允许您执行线程转储,您可以在其中调查所有正在运行的线程及其监视器的状态。除此之外,你可以实时观察线程,看看他们活动的时间和睡眠时间,并将该信息与线程转储相关联,以了解应用程序花费时间的位置。使用分析器可能很难获得的是各个变量的状态。
答案 2 :(得分:0)
您还可以向Tomcat实例的SIGQUIT
进程发送java
信号(数字代码3),例如做kill -3 <pid>
。这使得java
将所有线程的堆栈转储到sysout
- 它不会关闭进程,即使名称可能暗示了这一点。