Tomcat Web 应用程序线程转储
我有一个在 Tomcat 中运行的生产 Web 应用程序(Struts、iBatis、Hibernate),该应用程序在运行 6 - 7 天后在处理请求时会挂起,但在执行线程转储后会再次正常运行。
我很难弄清楚为什么会这样。
我只是想知道其他人是否遇到过类似的事情。
I have a production web application (Struts, iBatis, Hibernate) that runs in Tomcat that would hang while serving requests after 6 - 7 days of running but would run fine again after doing a thread dump.
I have a hard time figuring out why that is the case.
I was just wondering whether anyone else has ever encountered something similar.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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 查询导致使用了大量内存。
希望它能以某种方式有所帮助......
Maybe this will help you find the cause of your problem.
I have enable JMX on tomcat
(set these optional vm arguments when starting tomcat)
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=30188 (whatever port you want jmx to run on for tc)
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
I then wrote a little app that monitors memory usage (via jmx) and notifies me if the memory usage goes over , say 80%.
I would then know as soon as something is starting to go wrong. Then I will get a histogram for in-memory objects (see http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html for how to get that).
At the end it turned out that one of my ejbQL queries caused a huge amount of memory being used.
Hope it might help in some way ......
首先尝试在测试环境中重现这一点。您可以使用 JMeter 来对应用程序进行压力。您可以使用 -verbose:gc 和 -XX:+PrintGCDetails 启动 tomcat,这将使您更深入地了解 GC 运行时发生的情况。然后,当站点没有响应时,您可以获取线程转储,如果这可以解除站点的阻塞,请查看 GC 详细信息以获取更多信息。
First of all try to reproduce this in a test environment. You can use JMeter to stress the app. You can start tomcat using the -verbose:gc and -XX:+PrintGCDetails which will give you more insight on what is happening while GC runs. Then, when the site is not responding, you can get a thread dump and if this unblocks the site have a look at the GC details for more info.