4

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

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

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

4

2 回答 2

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=false

然后我写了一个小应用程序来监控内存使用情况(通过 jmx),如果内存使用量超过 80%,就会通知我。

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

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

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

于 2010-06-07T12:22:51.447 回答
1

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

于 2010-02-17T08:29:20.387 回答