为什么Tomcat5.5(使用Java1.4,在WindowsXP32位上运行)突然挂起?

为什么Tomcat5.5(使用Java1.4,在WindowsXP32位上运行)突然挂起?,java,windows,tomcat,Java,Windows,Tomcat,我用Java1.4运行Tomcat5.5已经有一段时间了,现在有一个巨大的webapp。大多数情况下,它运行良好,但有时它只是挂起,没有生成异常,除了重新启动Tomcat之外,没有明显的方法让它再次运行。tomcat实例在堆上允许有千兆字节的内存,但很少超过300 MB。还有其他人遇到过这个问题吗?有解决办法吗 澄清一下:我通过任务管理器和Eclipse确定了它使用了多少内存(我也尝试过在Eclipse之外运行它,但最终还是遇到了同样的问题,尽管需要更长的时间)。在Eclipse中,我查看通过其

我用Java1.4运行Tomcat5.5已经有一段时间了,现在有一个巨大的webapp。大多数情况下,它运行良好,但有时它只是挂起,没有生成异常,除了重新启动Tomcat之外,没有明显的方法让它再次运行。tomcat实例在堆上允许有千兆字节的内存,但很少超过300 MB。还有其他人遇到过这个问题吗?有解决办法吗


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

听起来你好像遇到了死锁

如果您可以在dev环境中复制它,那么尝试在它发生后附加一个调试器。看看你的线程,看看你是否有死锁


如达斯汀所指出的,如果无法连接调试器,则应该能够生成线程转储。

听起来好像遇到了死锁

如果您可以在dev环境中复制它,那么尝试在它发生后附加一个调试器。看看你的线程,看看你是否有死锁


如Dustin所指出的,如果无法连接调试器,则应该能够生成线程转储。

对于任何jvm进程,强制执行线程转储。在windows中,我相信这可以通过控制台窗口中的CTRL-BREAK来完成

在*nix中,它几乎总是“kill-3JVMPID”

这可能会显示是否有线程等待db连接池/线程池等

另一件要检查的事情是您当前有多少个到JVM的连接——使用NETSTAT或SysInternals实用程序,如tcpconn/tcpview(google it)

另外,尝试使用verbose:gc JVM标志运行。对于Sun的JVM,像“java-verbose:gc”一样运行。这将显示您的垃圾收集。如果它收集了很多(特别是完整的收集),那么可能是内存泄漏。完整的收集是昂贵的,尤其是在这样的大堆上


如何确定只使用了300mb?

对于任何jvm进程,强制执行线程转储。在windows中,我相信这可以通过控制台窗口中的CTRL-BREAK来完成

在*nix中,它几乎总是“kill-3JVMPID”

这可能会显示是否有线程等待db连接池/线程池等

另一件要检查的事情是您当前有多少个到JVM的连接——使用NETSTAT或SysInternals实用程序,如tcpconn/tcpview(google it)

另外,尝试使用verbose:gc JVM标志运行。对于Sun的JVM,像“java-verbose:gc”一样运行。这将显示您的垃圾收集。如果它收集了很多(特别是完整的收集),那么可能是内存泄漏。完整的收集是昂贵的,尤其是在这样的大堆上


如何确定只使用了300mb?

尝试增加Tomcat应用程序服务器的日志敏感度。


你可以在几天内增加对最好的或全部的鱼的敏感度,看看这是否有助于你捕获任何鱼

尝试增加Tomcat应用程序服务器的日志敏感度。


你可以在几天内增加对最好的或全部的鱼的敏感度,看看这是否有助于你捕获任何鱼

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

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

如果Tomcat在Windows中作为服务运行会发生什么?没有控制台窗口,所以如何获得线程转储?可能有几个选项——jstack(我想只有1.5或1.6)或类似Adaptej的东西。jstack使用起来真的很酷。如果Tomcat在Windows中作为服务运行,会发生什么?没有控制台窗口,所以如何获得线程转储?可能有几个选项——jstack(我想只有1.5或1.6)或类似Adaptej的东西。jstack使用起来真的很酷。