运行Servlet时出现RuntimeException:Tomcat自行重启

时间:2016-10-03 16:49:07

标签: java eclipse apache tomcat servlets

我是servlets的新手,并使用Tomcat 7.0.34版本(我们被指示仅使用此版本)。我的问题是Tomcat似乎在某个时间点重新启动,这发生在我不与servlet交互一段时间的时候。我看到以下内容:

enter image description here

此外,当我尝试通过eclipse进行调试时,我在调试窗口中看到以下条目:

Daemon Thread [http-bio-80-exec-1] (Suspended (exception RuntimeException)) 
ThreadPoolExecutor(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker) line: not available 
ThreadPoolExecutor$Worker.run() line: not available 
TaskThread(Thread).run() line: not available    

这在控制台中:

SEVERE: The web application [/csj] is still processing a request that has yet to finish. This is very likely to create a memory leak. You can control the time allowed for requests to finish by using the unloadDelay attribute of the standard Context implementation.
Okt 03, 2016 1:39:39 AM org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/csj] is completed

我想知道Tomcat重启的原因。如果我一直点击按钮没有延迟,那么就不会出现这个问题。

我试着看这里:Tomcat showing this error "This is very likely to create a memory leak". How to resolve this issue?和这里:The web application [ROOT] is still processing a request that has yet to finish. [Tomcat]但我无法理解。

似乎这个问题在较新版本的Tomcat中得到了解决:http://wiki.apache.org/tomcat/MemoryLeakProtection。不过我想了解这个问题是什么。

编辑:使用eclipse-mars

2 个答案:

答案 0 :(得分:0)

您的tomcat配置为"热部署"即如果您更改代码,tomcat将合并新代码而无需重新启动服务器。这可以在tomcat或eclipse上配置。您可以去那里并禁用它,因为它实际上是一个令人头痛的问题,消耗更多时间,有时无法正常工作。
Tomcat使用单独的类加载器加载每个webapp。它会监视您的文件是否有变化,如果发生更改,它会通过销毁类加载器来卸载您的webapp,然后使用新的类加载器再次加载。发生这种情况时,您会看到所提到的各种日志 对于eclipse配置,请参阅here
有关tomcat配置,请参阅here 另外,从Tomcat文档中,阅读this

答案 1 :(得分:0)

在server.xml中,设置reloadable =" false"。

来自https://tomcat.apache.org/tomcat-5.5-doc/config/context.html

如果您希望Catalina监视/ WEB-INF / classes /和/ WEB-INF / lib中的类以进行更改,则设置为true,并在检测到更改时自动重新加载Web应用程序。此功能在应用程序开发期间非常有用,但它需要大量的运行时开销,不建议在已部署的生产应用程序上使用。这就是为什么此属性的默认设置为false。但是,您可以使用Manager Web应用程序按需触发已部署应用程序的重新加载。