重新部署战争时是否有必要重启tomcat?

时间:2016-11-20 12:00:34

标签: java tomcat redeploy

我知道Tomcat在重新部署时可以重新加载('D2', 'D4', 'D5', 'D11') 文件,我不需要杀死Tomcat进程并重新启动它。我可以删除.war,等待Tomcat取消部署,然后将新的.war复制到Web路径。但是,经过多次简单的更新战争而没有重启Tomcat之后,Tomcat有可能无法有效释放内存或导致一些性能问题吗?假设一个Tomcat实例中只有一个war应用程序。

2 个答案:

答案 0 :(得分:3)

基本问题是Java目前不会在Java Virtual Machine (JVM)中运行的代码部分之间提供任何类型的隔离,就像operating system does with processes一样。您可以在不影响Windows / Linux / etc下的其他进程的情况下终止进程。您所能做的就是确保垃圾收集。

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

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

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

即使在生产环境中,您也可以使用VisualVM查看内存使用情况,以了解Tomcat JVM随时间发生的情况。

答案 1 :(得分:0)

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

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

停机时间怎么样?

这可能超出了您的问题的范围,但是当您想要阻止用户看到任何停机时间时,您将运行多个tomcat实例并一次部署和重新启动一个。