2010-02-17 125 views
4

我有一个在Tomcat中运行的生产Web应用程序,它在运行6 - 7天后提供请求时会挂起,但在执行线程转储后会再次正常运行。Tomcat Web应用程序线程转储

我很难弄清楚为什么是这种情况。

我只是想知道是否有其他人遇到类似的东西。

+3

您确定线程转储实际上与释放Tomcat挂起有关吗?这将是一个有趣的Heisenbugfix ... 如果你能以某种方式让Tomcat再次工作,你需要把它放在你的简历上;-) – Thilo 2010-02-17 08:27:32

+1

你是否已经能够将探查器附加到JVM上来查找发生了什么事情,否则,在可以附加探查器的地方复制问题? – 2010-02-17 08:30:54

回答

1

首先尝试在测试环境中重现此操作。您可以使用JMeter来强调应用程序。您可以使用-verbose:gc-XX:+ PrintGCDetails启动tomcat,这将使您更深入地了解GC运行时发生的情况。然后,当网站没有响应时,你可以得到一个线程转储,如果这个解锁站点有一个GC详细信息的更多信息。

+1

我有-verbose:gc和-XX:+ PrintGCDetails选项处于活动状态。当挂起发生时,完全GC不会发生。 – 2010-02-17 08:53:44

2

也许这会帮助你找到问题的原因。

我有tomcat的 启用JMX -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 30188(任何端口,你想对JMX(起tomcat时设置这些可选VM参数)为TC上运行) -Dcom.sun.management.jmxremote.ssl =假 -Dcom.sun.management.jmxremote.authenticate =假

我然后写一个小应用程序,监视存储器的使用(通过JMX)和通知我内存使用量是否超过80%。

只要出现问题,我就会知道。然后,我将获得内存对象的直方图(有关如何获取该内容的信息,请参见http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html)。

最后,事实证明,我的一个ejbQL查询导致了大量的内存被使用。

希望它可以在某些方面有所帮助......