Tomcat突然死了

时间:2012-02-03 17:06:06

标签: java tomcat crash jvm

尝试在64位Linux(CentOS)计算机上诊断一些奇怪的Tomcat(7.0.21)和/或JVM错误。

我正在加载测试我们的服务器应用程序并尝试用100K消息进行测试。推出jvisualvm并始终关注堆。一切都看起来很棒*(见下文),直到我得到大约93K处理过的消息,然后Tomcat就死了。在Tomcat的PID编号上找ps确认它已经死了。

直到崩溃:

  • 负载测试已运行约90分钟;应该很快完成,因为我们在93K / 100K)
  • CPU持有45%左右的强势
  • 使用堆大约2GB(在GC之后加上或减去一堆)但是大约30分钟后堆大小从4GB增加到MAX_HEAP
  • 类加载/卸载正常循环
  • 线程转储正常

服务器代码中没有任何地方调用System.exit() - 所以我们可以直接判断(是的,我已经仔细检查了!!!)。

我不确定这是Tomcat崩溃还是JVM(我怎么说?)。即使我知道,我似乎也找不到出错的迹象:

  • 所有服务器应用程序的日志都会在没有任何错误消息的情况下停止(即使我们将日志记录设置为DEBUG及更高版本)
  • Tomcat的catalina.out和尊重localhost_access_*文件只是停止而没有任何信息

我听说有可能让Tomcat在执行时记录一个coredump,但不知道如何做到这一点,并且在线示例没有多大帮助。

如何诊断这个?我应该采取哪些步骤来排除所有可能的因素?

提前致谢!

4 个答案:

答案 0 :(得分:14)

如果JVM崩溃,你应该有一个hs_err_pidNNN.log文件;您无需执行任何操作即可启用此功能。它的位置取决于您的操作系统以及您运行Tomcat的方式。在Windows上,除非您作为服务运行,否则它们可以显示在您的桌面上。否则,它们应该在崩溃进程的当前工作目录中。

您的操作系统可能提供了额外的过程监控工具;您可以更多地描述您的环境,或者可以在serverfault.com询问。

jvisualvm实际上也可能导致崩溃。

我会尝试重现这个问题,并逐步简化方案,以帮助找出原因。

答案 1 :(得分:6)

另一种可能性是操作系统内存不足而OOM Killer正在终止你的进程。在这种情况下,JVM将无法编写堆转储或hs_err_pid文件。

答案 2 :(得分:4)

您可以使用选项java -XX:+ HeapDumpOnOutOfMemoryError为因内存不足错误而导致的jvm崩溃创建堆转储。

此处有更多详情Using HeapDumpOnOutOfMemoryError parameter for heap dump for JBoss

答案 3 :(得分:1)

抱歉,我不得不从@erickson中删除绿色支票。我终于找到了杀死Tomcat的原因。

看起来好像没有使用VisualVM正确配置探查器插件,并且尝试在Tomcat进程上运行配置文件会将其终止。

立即调查原因,并在我了解更多后更新此答案。