【问题标题】:Tomcat Web Application Thread DumpTomcat Web 应用程序线程转储
【发布时间】:2011-01-17 18:17:57
【问题描述】:

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

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

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

【问题讨论】:

  • 你确定线程转储实际上与释放 Tomcat 挂起有关吗?这将是一个有趣的 Heisenbugfix...
  • 您是否能够将探查器附加到 JVM 以查明发生了什么,或者在失败时将问题复制到可以附加探查器的地方?

标签: java performance tomcat thread-dump


【解决方案1】:

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

我在 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 查询导致使用了大量内存。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我激活了 -verbose:gc 和 -XX:+PrintGCDetails 选项。挂起时未发生 Full GC。
    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多