我有一个在Tomcat中运行的生产Web应用程序(Struts,iBatis,Hibernate),它会在运行6到7天后处理请求时挂起但在执行线程转储后会再次运行。
我很难搞清楚为什么会这样。
我只是想知道其他人是否遇到过类似的事情。
答案 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详细信息以获取更多信息。