【问题标题】:Endless loop in a servlet - recovery possible?servlet 中的无限循环 - 可以恢复吗?
【发布时间】:2009-02-16 23:00:46
【问题描述】:

今天我修复了一个应用程序中的一个错误,该错误可能导致 servlet 请求/响应周期中的无限循环。

只是出于好奇:如果我的 servlet 实际上被困在 for(;;) 循环中会发生什么?

是否有可能恢复? tomcat会检测到这个吗?是否可以在不重新启动服务器的情况下杀死此实例?

或者这是可能发生的最糟糕的事情之一,并且是杀死网络容器的一种非常快速的方法?

编辑:这是一个真正的无限循环,一直消耗 CPU 而不是内存。我让它运行了几分钟。我想,我可以确认tomcat不会检测到这种事情:-)

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    我认为 Tomcat 不会检测到无限循环。如果 servlet 没有通过其循环消耗所有 CPU 时间,您可能可以使用 Tomcat 管理器停止 servlet。否则,重启服务器可能是最安全和最简单的。

    这就是为什么您在部署应用程序之前在本地进行大量测试的原因 ;-) 并且要非常小心所有循环都有退出条件...

    【讨论】:

    • 假设这个错误在导致生产问题之前就被检测到了 ;-)
    • 好!我当然不是有意让自己听起来居高临下——我相信你知道测试的重要性。
    【解决方案2】:

    不确定 Tomcat 是否有这样的检测,但例如 Websphere 的 Web 容器有。 但是,显然容器需要相对较长的时间来检测“挂起”的线程。负载下的服务器可以被这样的代码轻松快速地杀死。

    【讨论】:

    • 嘿 - 很高兴知道,websphere 检测到这样的东西。感谢您的信息
    【解决方案3】:

    如果无限循环是由无限重定向引起的,它迟早会以 StackOverflowException 终止该请求。

    这是一个“真正的”无限循环,您可能会永久占用一个 CPU/内核,并最终导致整个应用程序因 OutOfMemoryException 而崩溃。

    据我所知,tomcat 没有明确检测这些问题。

    【讨论】:

      【解决方案4】:

      我想你可以通过适当的超时设置来处理这个问题:

      http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html

      【讨论】:

      • 嗯...你确定吗?我阅读了您链接的文档,但看不到这些计时器如何检测到“挂起”(基本上是活锁)线程。如果我错了,请纠正我!
      • duffymo 链接到的超时是针对将 Tomcat 连接到 Apache 的 JK 连接器。所以不,他们可能不会提供帮助。
      【解决方案5】:

      WebLogic 可以检测卡住的线程: http://edocs.bea.com/wls/docs81/perform/WLSTuning.html#1125714

      不过,在 Tomcat 中还没有看到这个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 2014-07-28
        • 2022-11-19
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 2011-02-24
        相关资源
        最近更新 更多