调试tomcat崩溃

时间:2009-10-15 23:48:44

标签: java debugging tomcat

我有一个Tomcat实例,它会因为未知原因而定期崩溃。

日志中没有任何错误,只有事件查看器中的一行说“Tomcat意外终止”。

在测试环境中,我无法复制该问题。因此,我主要局限于对生产环境的被动监控。

问题似乎与内存无关,因为意外的终止显示与进程的内存使用没有明显的关联。

我可以采取哪些步骤来进一步诊断此问题?

编辑:

一些更正/澄清:

它实际上不是Tomcat的单个“实例”,而是具有类似配置的几个实例。

操作系统是Windows 2003。

Java版本是Java 6.

更新

看起来这个问题可能与内存有关。发现了一些在Tomcat目录中创建的故障转储(不是...... / Tomcat / logs)。

转储主要包含错误,例如:

java.lang.OutOfMemoryError:为ChunkPool :: allocate请求了32756个字节。没有交换空间?

这是意料之外的,因为当内存使用量相对较低时(与历史使用情况相比),该过程有时会崩溃。

在所有转储中,perm gen空间的使用率为99%,但从绝对意义上讲,这种使用情况并不一致,并且远未达到-XX:MaxPermSize中指定的限制。

2 个答案:

答案 0 :(得分:1)

这向我表明整个JVM崩溃了,这是一件相当不寻常的事情。我会考虑以下步骤:

  • 首先检查硬件是否正常。运行memtest86 + - http://www.memtest86.com/或在Ubuntu cd上运行以测试内存。让它运行一段时间绝对确定。
  • 然后查看您使用的Java版本是否正常。某些版本的Java 6破坏了一些微妙的功能。目前,最新的Java 5可能是一个很好的解决方案。
  • 禁用Tomcat本机代码以提高性能。 Tomcat使用本机库来某些东西。由于你有一个崩溃的JVM,摆脱本机代码是一个非常好的开始。
  • 查看您使用的Windows版本是否存在某些限制。终止前的CPU使用限制或任何其他配额。

答案 1 :(得分:1)

通常,如果进程在Windows中崩溃,则会创建转储文件。在windbg(Windows调试器)中加载转储文件,并获取导致异常的线程的堆栈跟踪。这应该可以让您更好地了解问题所在。