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

时间:2009-02-16 23:00:46

标签: java servlets

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

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

以某种方式可以恢复吗? tomcat会检测到这个吗?可以在不重启服务器的情况下杀死此实例吗?

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

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

它是一个“真正的”无限循环,你可能永久地占用一个CPU /核心并最终使用OutOfMemoryException崩溃整个应用程序。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

但是在Tomcat中还没有看到这个。