为什么Tomcat 5.5(使用Java 1.4,在32位Windows XP上运行)突然挂起?
我已经使用大型Web应用程序运行了带有Java 1.4的Tomcat 5.5已有一段时间了。在大多数情况下,它运行良好,但有时它会挂起,没有生成异常,并且除了重新启动Tomcat外,没有其他使它再次运行的明显方法。 Tomcat实例在堆上允许有1 GB的内存,但很少超过300 MB。是否还有其他人遇到过此问题,并且有解决方案吗?
为了澄清起见:我确定了通过任务管理器和Eclipse使用了多少内存(我也尝试过在Eclipse之外运行它,但是最终会遇到相同的问题,尽管要花更长的时间)。使用Eclipse,我将查看通过其较小的(可选)内存窗格分配的内存,以及通过任务管理器分配给javaw.exe的内存。我使用sysdeo吗? Eclipse的tomcat插件。
解决方案
回答
听起来我们好像陷入僵局。
如果我们可以在开发环境中重现它,请尝试在发生调试后添加调试器。查看线程,看看是否有任何死锁。
正如Dustin指出的那样,如果我们无法连接调试器,则应该能够生成线程转储。
回答
对于任何jvm进程,强制执行线程转储。我相信,在Windows中,可以通过CTRL-BREAK在控制台窗口中完成此操作。
在* nix中,几乎总是" kill -3 jvm-pid"。
这可能表明我们是否有线程在数据库连接池/线程池等上等待。
要检查的另一件事是我们当前与JVM有多少连接-使用NETSTAT或者SysInternals实用程序,例如tcpconn / tcpview(使用Google)。
另外,尝试使用verbose:gc JVM标志运行。对于Sun的JVM,运行方式类似于" java -verbose:gc"。这将显示垃圾回收。如果收集很多(特别是全收集),则可能是内存泄漏。完整的收藏非常昂贵,尤其是在像这样的大堆上。
我们如何确定仅使用了300mb?
回答
尝试提高Tomcat应用程序服务器的日志记录敏感性。
http://tomcat.apache.org/tomcat-5.5-doc/logging.html
我们可以在几天之内提高大多数传感器对FINEST或者ALL的敏感度,看看是否可以捕获任何东西。
回答
我同意创建多个线程转储并通过以下方式查看它们:线程转储分析器