3

我正在以 root 权限运行 Tomcat,并且有一个 url,每当我访问时,它都会导致 Tomcat 进程终止,而 catalina.log 中没有任何日志。事实证明,我的应用程序中有一个死循环。但我的假设是,处理请求时的死循环(实际上是无限递归)只会导致可能终止 Tomcat 创建的当前线程的 stackoverflow 异常。

我的问题是,应用程序的死循环是否可能导致整个 Tomcat 崩溃?如果是这样,我如何观察错误日志?

对不起,我没有指出它实际上是我的代码中的无限递归,我在 Eclipse 下调试了很多,它是永远不会退出的递归停止请求但我等待了很长时间后才得到 StackOverflowError ,但是我想知道为什么tomcat崩溃了?

4

1 回答 1

2

您确实需要更具体并显示一些相关代码。但是,有几点想法:

  • 单独的无界循环不会导致StackOverflowError. 它只会无限期地停止。该异常通常是由于深度递归导致堆栈空间不足引起的,这不是您描述代码的方式。

  • 听起来您对违规代码的位置有预感。在这种情况下,您可能应该自己添加一些日志消息以获取更多信息。有关登录 Tomcat 的信息,请参阅以下资源:

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

如果您想要更具体的答案,则必须发布更详细的信息。


关于您的编辑的更新:

Tomcat 在单个 JVM 中运行所有 Web 应用程序(它也在该 JVM 中运行),只是使用不同的类加载器。这意味着所有应用程序共享相同的堆栈空间,因此可以想象,如果一个应用程序占用过多的堆栈空间,其他应用程序和 Tomcat 本身也会开始遇到问题——可能会遇到自己的堆栈溢出错误。在没有看到任何代码的情况下,这是我所能得到的最具体的。

如果您有一个应用程序存在行为不端的风险,则可以运行多个 Tomcat 实例(即单独的 JVM),以便该应用程序中的问题不会影响其他应用程序。有关运行多个实例并将它们集成在一起的信息,请参阅 Tomcat 发行版中包含的文件RUNNING.TXT 。

然而,显然,最好的方法是解决代码中的问题。:)

于 2013-11-08T06:36:39.887 回答