我已经用Java 1.4运行Tomcat 5.5一段时间了,现在有一个巨大的webapp。大多数情况下它运行正常,但有时它会挂起,没有异常生成,并且除了重新启动Tomcat之外没有任何让它再次运行的方法。 tomcat实例在堆上允许1 GB的内存,但很少超过300 MB。有没有其他人遇到过这个问题,并且有解决方案吗?
为了澄清:我通过任务管理器和Eclipse确定了它使用了多少内存(我也尝试在Eclipse之外运行它,但最终会遇到同样的问题,尽管需要更长的时间)。使用Eclipse,我查看通过其小(可选)内存窗格分配的内存以及通过任务管理器分配给javaw.exe的数量。我用的是sysdeo? Eclipse的tomcat插件。
答案 0 :(得分:3)
对于任何jvm进程,强制进行线程转储。在Windows中,我相信,这可以通过CTRL-BREAK在控制台窗口中完成。
在* nix中,它几乎总是“kill -3 jvm-pid”。
如果你有线程等待数据库连接池/线程池等,这可能会显示
要检查的另一件事是你当前有多少连接到JVM - 使用NETSTAT或SysInternals实用程序,如tcpconn / tcpview(google it)。
另外,尝试使用verbose:gc JVM标志运行。对于Sun的JVM,运行方式如“java -verbose:gc”。这将显示您的垃圾收集。如果它收集了很多(特别是FULL COLLECTIONS),那么你可能会有内存泄漏。完整的收藏品价格昂贵,特别是在像这样的大堆上。
您如何确定仅使用300mb?
答案 1 :(得分:0)
听起来你正陷入僵局。
如果您可以在开发环境中重现它,那么尝试在调试器发生后附加它。看看你的线程,看看你是否有任何死锁。
如果您无法连接调试器,您应该能够生成线程转储,正如Dustin指出的那样。
答案 2 :(得分:0)
尝试提高Tomcat应用程序服务器的日志记录敏感度。 http://tomcat.apache.org/tomcat-5.5-doc/logging.html
你可以在几天内增加对大多数人的FINEST或ALL的敏感度,看看是否有助于你抓住任何东西。
答案 3 :(得分:0)
我同意创建多个线程转储并查看它们:Thread Dump Analyzer