2016-11-20 127 views
1

我知道Tomcat在重新部署时可以重新加载.war文件,我不需要杀死Tomcat进程并重新启动它。我可以删除.war,等待Tomcat取消部署,然后将新的.war复制到Web路径。但是,在不重启Tomcat的情况下进行了许多次微小的更新战争之后,Tomcat是否有可能无法有效释放内存或导致某些性能问题?假设在一个Tomcat实例中只有一个war应用程序。重新部署战争时需要重启tomcat吗?

回答

2

基本问题是,Java目前不提供在Java Virtual Machine (JVM)中运行的代码部分之间的任何形式的隔离,其方式与operating system does with processes相同。你可以杀死一个进程而不影响Windows/Linux /等下的其他进程。你所能做的就是确保事物可以被垃圾收集。

对于Tomcat,WAR的处理方式 - 根据various specifications - 要求每个战争都有自己的类加载器,负责运行该代码。当WAR未被部署时,最终的结果应该是该类加载器应该被垃圾收集。

不幸的是,garbage collector只能处理完全未被引用的对象,并且WAR代码中可能存在大量可以禁止的错误错误,然后每次重新部署都会导致创建另一个类装入器并且不会销毁所以你有内存泄漏。在Tomcat本身内部检测和解决这些类型的错误方面已经付出了很多努力,但如果没有JVM支持,几乎不可能做到100%。

除修复WAR之外,唯一的解决方法是重新启动JVM。

即使在生产中,您也可以通过VisualVM观察内存使用情况,以了解Tomcat JVM随时间的变化。

+0

请注意,_developing_一个WAR与_deploying_一个WAR有很大的不同。您的IDE应该完全控制热部署经常发生的Web容器,而不是 - 通常 - 手动部署。换句话说,这应该发生得比较少。 –

0

是的。要停止Tomcat,部署新的战争,然后重新启动Tomcat,这会更加清洁。缺点是大部分应用程序类默认情况下不会被加载,直到有新的请求进入应用程序,但它不是一个大问题。只是意味着在第一次请求新WAR时启动几秒钟。这就是我们如何在生产中部署战争。

还允许我们在日志中设置健康检查,如果新的战争阻止Tomcat正确启动,那么我们回滚战争,知道这是一个问题,但这是一个单独的主题。

停机时间是多少?

这可能是出于你的问题的范围,但如果你想阻止用户看到任何停机时间,你会运行Tomcat的多个实例和部署,并重新启动一次一个。