18

我们的 Tomcat 5.5 在晚上停止在我们的生产服务器(Linux CentOS 4.8)上遇到问题,我们不知道它为什么停止...... catalina.out 中没有 Tomcat 的日志或任何应用程序的日志。

我们尝试了不同的方法来找出服务器停止的原因:

  • 将 Tomcat 配置为能够生成核心转储
  • 使用 javassist检测System.exit()方法以查找是否调用了该方法
  • 向 JVM 添加关闭挂钩(使用Runtime.getRuntime().addShutdownHook()

它们都不起作用,我们没有核心转储,没有调用 Exit 方法和关闭挂钩。我的结论是:

  • 虚拟机未正确终止,但在没有任何日志的情况下崩溃。

有什么想法或日志可以阅读以找出 Tomcat 停止的原因吗?

4

4 回答 4

24

1) Make sure you know where stderr is redirected and check if anything got printed there.

2) Check the memory limits on Tomcat and how much free memory does the system have. Review the Linux system logs under /var/log to see if anything suspicious happened during the time. For example, kernel can randomly kill a process (almost) without a trace if the system is running low on memory.

We've ran 5.5 in production for years and never had any unexplained shutdowns, FWIW.

于 2012-04-24T15:34:33.213 回答
4

这对我有用。

正如在其他答案中所建议的那样,检查了系统登录,/var/log/messages但我的权限被拒绝了。所以,我改用dmesg命令并在日志中得到了这个

“内存不足:杀死进程 14606 (java) 得分 106 或牺牲孩子”。

在输出中,我还注意到Swap Memory free 0 K。Rantop命令确认相同。所以,不知何故,内存使用率很高,导致操作系统杀死了我的 tomcat 进程。

花了几个小时终于找到了原因。

ps -ef | grep tomcat表明有多个 tomcat 进程在为同一个应用程序运行。看来,较早的tomcat关闭可能没有成功完成,并且由于某种原因,即使在关闭之后进程也没有被杀死,这导致了高内存使用。

因此,使用 . 杀死所有正在运行的 tomcat 进程kill。SWAP 内存被释放。

再次启动tomcat,工作正常。:)

于 2018-09-18T14:19:29.807 回答
0

很可能存在堆栈溢出异常。这是 Tomcat 发生时的典型行为。例如,您尝试序列化为具有循环依赖关系的 JSON 或 XML bean(但不处理循环)。

每次我遇到这个问题(好几次)它总是这个问题。所有其他停止通常都会正确记录(如 OutOfMemory 等)。

这种类型的止损在任何地方都没有留下任何痕迹。

于 2012-04-24T15:20:07.247 回答
0

Tomcat 7 在 catalina 中有一个选项来防止 System.exit 类调用或类似的东西: http: //ci.apache.org/projects/tomcat/tomcat7/docs/security-manager-howto.html

也许 5.5 版本也有类似的选项。尝试文档。

有一些选项可以将输出重定向到用于启动 Tomcat 的同一控制台。当您在基于 Unix 的系统上执行时,此信息将重定向到日志,在 Windows 上,如果未重定向,它将保留在控制台中。

于 2012-04-24T15:29:58.250 回答