0

我已经用 Java 1.4 运行 Tomcat 5.5 有一段时间了,现在有一个巨大的 web 应用程序。大多数情况下它运行良好,但有时它会挂起,不会产生异常,除了重新启动 Tomcat 之外,没有明显的方法让它再次运行。tomcat 实例允许在堆上使用千兆字节的内存,但很少超过 300 MB。有没有其他人遇到过这个问题,是否有解决方案?

澄清一下:我通过任务管理器和 Eclipse 确定了它使用了多少内存(我也尝试在 Eclipse 之外运行它,但最终会遇到同样的问题,尽管它需要更长的时间)。在 Eclipse 中,我查看了通过它的小(可选)内存窗格分配的内存以及通过任务管理器分配给 javaw.exe 的数量。我用的是sysdeo?用于 Eclipse 的 tomcat 插件。

4

4 回答 4

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?

于 2008-09-15T19:47:31.830 回答
0

听起来你正在陷入僵局。

如果您可以在开发环境中重现它,那么在它发生后尝试附加调试器。看看你的线程,看看你是否有任何死锁。

正如 Dustin 指出的那样,如果您无法附加调试器,您应该能够生成线程转储。

于 2008-09-15T19:47:02.390 回答
0

尝试增加 Tomcat 应用程序服务器的日志记录敏感度。 http://tomcat.apache.org/tomcat-5.5-doc/logging.html

您可以在几天内提高大多数人对 FINEST 或 ALL 的敏感度,看看这是否有助于您捕捉到任何东西。

于 2008-09-15T19:47:53.387 回答
0

我同意创建多个线程转储并通过以下方式查看它们:Thread Dump Analyzer

于 2008-09-15T19:55:13.760 回答