Tomcat没有任何日志或任何堆栈就停止了

时间:2012-04-24 15:17:10

标签: java tomcat crash virtual-machine

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

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

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

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

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

任何想法或日志阅读以找出Tomcat停止的原因?

4 个答案:

答案 0 :(得分:23)

1)确保你知道stderr被重定向的位置并检查是否有任何打印在那里。

2)检查Tomcat的内存限制以及系统有多少可用内存。查看/ var / log下的Linux系统日志,查看在此期间是否发生了任何可疑事件。例如,如果系统内存不足,内核可以随机杀死一个进程(几乎没有跟踪)。

我们已经在生产中运行了5.5年,从未有任何无法解释的停机,FWIW。

答案 1 :(得分:3)

这对我有用。

如此处其他答案所示,已检查系统登录/var/log/messages,但拒绝了我的权限。因此,我改用dmesg命令并将其保存在日志中

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

在输出中,我还注意到可用内存交换0 K 。运行top命令以确认相同。因此,由于某种原因内存占用率很高,导致操作系统终止了我的tomcat进程。

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

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

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

再次启动tomcat,效果很好。 :)

答案 2 :(得分:0)

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

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

这种类型的停留不会留下任何痕迹。

答案 3 :(得分:0)

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

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

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