Tomcat进程崩溃,没有任何日志记录。

3
我正在以root权限运行Tomcat,有一个URL,每当我访问它时,就会导致Tomcat进程在catalina.log中没有任何日志的情况下终止。原来是我的应用程序中存在死循环。但是我假设处理请求时的死循环(实际上是无限递归)只能导致堆栈溢出异常,可能终止由Tomcat创建的当前线程。

我的问题是,应用程序的死循环是否可能导致整个Tomcat崩溃?如果是这样,我该如何观察错误日志?
抱歉,我没有指出实际上是我的代码中存在无限递归,我已经在Eclipse下进行了大量调试,发现递归永远不会退出,但请求被挂起,等待很长时间后我才得到StackOverflowError,但我想知道为什么Tomcat会崩溃?

你正在运行哪个版本的Tomcat,以及在哪个平台上? - Jason C
但是Tomcat会没有任何日志退出吗?我在catalina.out或其他日志中都没有找到任何日志。顺便说一下,版本是5.5.31。 - 夜神ライト
如果Tomcat崩溃了,特别是由于它耗尽了堆栈空间,那么可能会发生什么问题就真的无法预测了。也许它没有刷新日志,或者由于堆栈空间不足而导致日志记录设施遇到错误。 - Jason C
这篇回答的作者:https://dev59.com/g2kv5IYBdhLWcg3w3Eel#10300943 还指出,由于堆栈错误通常不会留下日志,Tomcat 崩溃时也可能没有任何日志。如果 JVM 崩溃了,它可能在某个地方留下了一个 hs_err_pid.log 文件。 - Jason C
1个回答

2
你真的需要更具体一些,展示一些相关的代码。然而,我有几个想法:
  • 一个无限循环本身不会导致StackOverflowError。它只会无限制地停止。该异常通常是由于深度递归导致的堆栈空间耗尽,而您描述的代码并非如此。

  • 听起来您对有问题的代码位置有一些直觉。在这种情况下,您应该自己添加一些日志消息以获取更多信息。请参阅以下资源以了解有关Tomcat日志记录的信息:

  • 您还可以考虑在调试器中运行您的服务(例如,Eclipse具有Web应用程序调试器,许多IDE也有),或者在Tomcat之外测试您的代码。

如果您想要更具体的答案,您将需要发布更详细的信息。
关于您的编辑更新:
Tomcat在单个JVM中运行所有Web应用程序(它本身也在该JVM中运行),只是使用不同的类加载器。这意味着所有应用程序共享相同的堆栈空间,因此,如果一个应用程序占用了太多的堆栈空间,其他应用程序和Tomcat本身也可能会遇到问题,可能会遇到自己的堆栈溢出错误。这是我在没有看到任何代码的情况下能够给出的最具体的信息。
如果您有一个有风险的应用程序,可以运行多个Tomcat实例(即单独的JVM),以便该应用程序的问题不会影响其他应用程序。请参阅随Tomcat分发的RUNNING.TXT文件,了解有关运行多个实例并将它们集成在一起的信息。
显然,最好的方法是修复您的代码中的问题。 :)

谢谢你的回答!我已经编辑了我的问题。 - 夜神ライト
@夜神ライト 我已经更新了答案,加入了更多(希望有用的)信息,并注明了为不正常运行的应用程序运行单独的Tomcat实例的注意事项。 - Jason C
你好,我已经在 $JAVA_HOME 和 $TOMCAT_HOME 的每个文件夹下搜索了,但仍然找不到 hs_err_pid.log 文件。我应该在运行 Tomcat 时添加一些设置吗? - 夜神ライト
如果您可以升级到Tomcat 6.x,您可以尝试禁用日志缓冲,如http://tomcat.apache.org/tomcat-6.0-doc/logging.html所述(请参见juli配置或您正在使用的任何记录器)。据我所知,Tomcat 5.5没有缓冲控制选项,至少不是使用juli。但实际上,您应该修复代码中的错误(一个简单的测试是禁用代码部分--您说您在调试器中看到了错误,您应该尝试在那里进行更正)。 - Jason C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接