15 为什么 Tomcat 5.5(带有 Java 1.4,在 32 位 Windows XP 上运行)突然挂起?

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

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

请先 登录 后评论

2 个回答

Herms

听起来你遇到了僵局。

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

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

请先 登录 后评论
DustinB

对于任何 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?

请先 登录 后评论