代码之家  ›  专栏  ›  技术社区  ›  Mo.

可以在servlet中无限循环恢复吗?

  •  5
  • Mo.  · 技术社区  · 16 年前

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

    所以出于好奇:如果我的servlet被困在for(;)循环中,会发生什么?

    是否有可能恢复?Tomcat会发现这个吗?是否可以在不重新启动服务器的情况下终止此实例?

    或者这是可能发生的最糟糕的事情之一,也是杀死WebContainer的快速方法?

    编辑:这是一个真正的无休止的循环,一直在消耗CPU,而不是内存。我让它跑了几分钟。我想,我可以确认,Tomcat不会检测到这类东西。

    5 回复  |  直到 16 年前
        1
  •  1
  •   David Z    16 年前

    我认为Tomcat不会检测到无限循环。如果servlet没有用它的循环消耗所有的CPU时间,那么可以使用Tomcat管理器来停止servlet。否则,重新启动服务器可能是最安全和最容易的。

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

        2
  •  1
  •   david a.    16 年前

    不确定Tomcat是否有这样的检测,但例如WebSphere的Web容器有。 但是,很明显,容器检测“挂起”线程需要相当长的时间。这样的代码可以很容易、快速地杀死负载下的服务器。

        3
  •  1
  •   Andreas Petersson    16 年前

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

    它是一个“真正的”无休止的循环,你可能会永久地占用一个CPU/核心,最终导致整个应用程序崩溃而没有内存异常。

    据我所知,Tomcat没有对这些问题进行明确的检测。

        4
  •  0
  •   duffymo    16 年前

    我想您可以使用适当的超时设置来处理这个问题:

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

        5
  •  0
  •   Martin Dow    16 年前

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

    不过,在《汤姆猫》里没见过这个。