今天我修复了一个可能导致servlet请求/响应周期无限循环的应用程序中的错误。
所以只是出于好奇:如果我的servlet实际上被困在for(;;)循环中会发生什么?
以某种方式可以恢复吗? tomcat会检测到这个吗?可以在不重启服务器的情况下杀死此实例吗?
或者这是可能发生的最糟糕的事情之一,还是一种快速杀死网络容器的方法?
编辑:这是一个真正的无限循环,一直消耗CPU而不是内存。我让它运行了几分钟。我想,我可以确认tomcat不会检测到这种情况: - )答案 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中还没有看到这个。