重新部署war需要重启tomcat吗?

Posted

技术标签:

【中文标题】重新部署war需要重启tomcat吗?【英文标题】:Is it necessary to restart tomcat when redeploy a war? 【发布时间】:2017-04-03 21:07:56 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

请注意,开发 WAR 与部署 WAR 大不相同。您的 IDE 应该完美控制经常发生热部署的 Web 容器,而不是通常的手动部署。换句话说,这种情况应该很少发生。【参考方案2】:

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

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

停机时间呢?

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

【讨论】:

以上是关于重新部署war需要重启tomcat吗?的主要内容,如果未能解决你的问题,请参考以下文章

tomcat发布war包需要重启tomcat吗?

tomcat服务器重新部署工程或者修改了项目的代码就必须重启tomcat吗?

Grails:无需重启容器即可部署 Tomcat

Tomcat没有自动部署war文件

SpringBoot之打成war包部署到Tomcat

SPRING BOOT 手动 War 文件部署到 Tomcat 并重新启动服务器,不创建数据库