Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重新部署战争时是否需要重新启动tomcat?_Java_Tomcat_Redeploy - Fatal编程技术网

Java 重新部署战争时是否需要重新启动tomcat?

Java 重新部署战争时是否需要重新启动tomcat?,java,tomcat,redeploy,Java,Tomcat,Redeploy,我知道Tomcat可以在重新部署时重新加载.war文件,我不需要终止Tomcat进程并重新启动它。我可以删除.war,等待Tomcat取消部署,然后将新的.war复制到web路径。但是,在多次没有重启Tomcat的琐碎更新战之后,Tomcat是否可能不会有效地释放内存或导致一些性能问题?假设一个Tomcat实例中只有一个war应用程序。基本问题是,Java目前不提供在中运行的代码部分之间的任何隔离,就像。在Windows/Linux/等环境下,您可以在不影响另一个进程的情况下杀死一个进程。您所能

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

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

对于Tomcat来说,按照的处理方式要求每个war都有自己的类加载器,负责运行代码。当WAR被取消部署时,最终的结果应该是类装入器应该被垃圾收集

不幸的是,该类只能处理完全未引用的对象,并且在WAR代码中可能存在大量微妙的bug,这些bug可能会阻止这种情况的发生,然后每次重新部署都会导致创建另一个类加载器,而没有一个类加载器被销毁,因此内存泄漏。在检测和解决Tomcat本身内部的这些类型的bug方面已经付出了大量的努力,但是如果没有JVM支持,要做到100%正确几乎是不可能的

除了修复战争之外,唯一的解决办法是重启JVM


您甚至可以在生产环境中观察内存使用情况,看看随着时间的推移Tomcat JVM会发生什么。

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

还允许我们在日志中设置健康检查,如果新的war阻止Tomcat正确启动,那么我们回滚war,知道存在问题,但这是一个单独的主题

休息时间呢?

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

请注意,发动战争与部署战争大不相同。IDE应该能够完美地控制经常发生热部署的web容器,而不是通常的手动部署。换句话说,这种情况应该很少发生。