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

StackOverflow https://stackoverflow.com/questions/66104

  •  09-06-2019
  •  | 
  •  

我已经在 Tomcat 5.5 和 Java 1.4 上运行一段时间了,现在有一个巨大的 Web 应用程序。大多数时候它运行良好,但有时它会挂起,没有生成任何异常,并且除了重新启动 Tomcat 之外没有明显的方法让它再次运行。tomcat 实例在堆上允许有 1 GB 内存,但很少超过 300 MB。有其他人遇到过这个问题吗?有解决办法吗?

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

有帮助吗?

解决方案

对于任何 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”几天,看看这是否可以帮助您捕捉到任何东西。

我同意创建多个线程转储并通过以下方式查看它们: 线程转储分析器

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top