2011-09-01 15 views
3

我们有一个生产Web应用程序,似乎有一个线程卡住做一堆工作,并运行CPU和平均负载。我几乎知道问题所在 - 我们的DWR服务正在将非常大的东西转换为Javascript对象响应。问题是我不知道哪个服务调用产生了这么大量的数据,因为线程在我的任何代码之外(它在DWR servlet中将我的返回值转换为出站JavaScript对象...否则我可以请参阅线程转储中的我的服务方法)。如何从正在运行的生产Tomcat Web应用程序获取线程调试信息?

你并不需要了解DWR帮我,但因为我的问题是这样的:

这是任何方式对我来说,寻找到一个部署Web应用程序(Tomcat的6),看看是什么样的状态线程在,如变量值等?如果我可以基本上采用线程的“调试快照”,就好像我在本地开发期间在调试模式下有一个断点一样,但是让我看到或打印出某个值的任何解决方案都是有用的。

谢谢!

UPDATE

如果可以不重新启动服务器,这将是最好的,因为这个问题只出现在一段时间每一次,并重新启动使问题消失。看起来JProfiler需要在JVM中添加-agentpath选项,所以我需要重新启动它。

回答

4

是的,你可以将Visual VM 1.3.2,与所有的插件下载和安装,看到每一个线程,堆中代等

+0

完美,谢谢! –

0

可以在Eclipse中打开源的状态,并附加一个远程调试器。它与其他任何Java应用程序没有什么不同。 Remote Debugging Article。您可以在应用中插入断点并随意暂停线程。

另一种选择是像JProfiler,Yourkit或VisualVM这样的分析器。这个工具允许你在线程转储的地方调查所有正在运行的线程及其监视器的状态。除此之外,您可以实时观察线程,查看它们活动的时间和时间,以及将这些信息与线程转储相关联,以了解您的应用程序在哪里花费时间。使用分析器可能很难得到的是单个变量的状态。

+0

这将与重新启动,但VisualVM让我做到这一点,无需重新启动...谢谢! –

+0

无论如何,您需要重新启动以启用用于VisualVM监控的jmx内容。 – nsfyn55

+0

不正确。只需附加到JVM即可。 – duffymo

0

您也可以将SIGQUIT信号(数字代码3)发送到您的Tomcat实例的java进程,例如,通过做kill -3 <pid>。这使得java将所有线程的堆栈转储到sysout - 它不会关闭该进程,即使名称可能暗示该进程。

相关问题