java - 重新部署war时需要重启tomcat吗?

标签 java tomcat redeploy

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

最佳答案

基本问题是 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 随着时间的推移会发生什么。

关于java - 重新部署war时需要重启tomcat吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40703778/

相关文章:

tomcat - EntityManager 注入(inject)不适用于 Tomcat + OpenEJB

java - Tomcat 崩溃并出现错误 java.lang.OutOfMemoryError : GC overhead limit exceeded

java - 生产服务器上的 Tomcat、PermGen 和重新部署

tomcat - 在容器环境中优雅地停止 Logback

java - 在不重新部署的情况下更新 logback 配置

java - 重置 ContentPane 时,按钮功能不再正常工作 Java swing

java - 如何调用以对象作为参数的方法?

java - 如何使用 PATCH 方法发送 Salesforce 更新请求?

java - 如何执行特定代码然后返回主代码

java - 如何在 Tomcat 8 上增加 JVM 内存