Tomcat Web应用程序线程转储

时间:2010-02-17 08:21:46

标签: java performance tomcat thread-dump

我有一个在Tomcat中运行的生产Web应用程序(Struts,iBatis,Hibernate),它会在运行6到7天后处理请求时挂起但在执行线程转储后会再次运行。

我很难搞清楚为什么会这样。

我只是想知道其他人是否遇到过类似的事情。

2 个答案:

答案 0 :(得分:2)

也许这可以帮助您找到问题的原因。

我在tomcat上启用了JMX (在启动tomcat时设置这些可选的vm参数) -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port = 30188(你希望jmx为tc运行的任何端口) -Dcom.sun.management.jmxremote.ssl = FALSE -Dcom.sun.management.jmxremote.authenticate =假

然后我编写了一个监视内存使用情况的小应用程序(通过jmx)并通知我内存使用情况是否超过80%。

一旦出现问题,我就会知道。然后我会得到内存中对象的直方图(参见http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html了解如何获得)。

最后我发现我的一个ejbQL查询导致了大量的内存使用。

希望它可能在某种程度上有所帮助......

答案 1 :(得分:1)

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