Tomcat突然死了

尝试在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,但不知道如何做到这一点,在线示例没有多大帮助。

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

提前致谢!

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

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

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

我尝试重现问题,并逐步简化方案,以帮助隔离原因。

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

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

有关详细信息,请使用HeapDumpOnOutOfMemoryError参数进行JBoss的堆转储 。

对不起,我不得不从@erickson中删除绿色支票。 我终于弄明白是什么杀死了Tomcat。

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

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