雄猫突然死亡

2022-09-02 21:20:48

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

我正在对我们的服务器应用程序进行负载测试,并尝试用100K条消息击中它。启动并始终关注堆。一切看起来都很棒*(见下文),直到我得到大约93K处理过的消息,然后Tomcat就死了。在Tomcat的PID号码上运行了一个,以确认它已经死了。jvisualvmps

在这次崩溃之前:

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

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

我不确定这是Tomcat崩溃还是JVM(我怎么知道?)。即使我知道,我似乎也找不到任何迹象表明出了什么问题:

  • 服务器应用程序的所有日志都停止,没有任何错误消息(即使我们将日志记录普遍设置为DEBUG及更高版本)
  • 雄猫和尊重文件只是停止没有任何信息catalina.outlocalhost_access_*

我听说可以让Tomcat在这样做时记录一个核心转储,但不确定如何做到这一点,在线示例也没有多大帮助。

SO将如何诊断这个问题?我应该采取什么步骤来开始排除所有可能的因素?

提前致谢!


答案 1

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

您的操作系统可能提供了用于进程监视的其他工具;你可以更多地描述你的环境,或者问 serverfault.com

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

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


答案 2

另一种可能性是操作系统内存不足,OOM杀手正在杀死您的进程。在这种情况下,JVM 将没有机会编写堆转储或hs_err_pid文件。


推荐