use*_*219 3 java tomcat redeploy
我知道Tomcat可以.war在重新部署时重新加载文件,我不需要杀死Tomcat进程并重新启动它。我可以删除.war,等待 Tomcat 取消部署它,然后将新的复制.war到 Web 路径。但是,经过多次不重启Tomcat的琐碎更新战,Tomcat是否有可能无法有效释放内存或导致一些性能问题?假设一个 Tomcat 实例中只有一个 war 应用程序。
基本问题是,Java 目前没有在Java 虚拟机 (JVM) 中运行的代码部分之间提供任何类型的隔离,就像操作系统对进程所做的那样。你可以在 Windows/Linux/etc 下杀死一个进程而不影响另一个进程。您所能做的就是确保可以垃圾回收。
对于 Tomcat,处理WAR的方式——根据各种规范——要求每个战争都有自己的类加载器,负责运行该代码。当 WAR 被取消部署时,最终的结果应该是该类加载器应该被垃圾收集。
不幸的是,垃圾收集器只能处理完全未被引用的对象,并且在 WAR 代码中可能存在大量微妙的错误,这些错误可以禁止这样做,然后每次重新部署都会导致创建另一个类加载器并且没有销毁,所以你有内存泄漏。在 Tomcat 内部检测和解决这些类型的错误方面付出了很多努力,但如果没有 JVM 支持,几乎不可能做到 100% 正确。
除了修复 WAR 之外,唯一的解决方法是重新启动 JVM。
即使在生产环境中,您也可以使用VisualVM观察内存使用情况,以了解 Tomcat JVM 随着时间的推移会发生什么。