我知道 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/