热部署在内部是如何工作的?

How hot deployment works internally?

我正在使用 eclipse 服务器功能进行热代码部署。使用 tomcat 作为网络服务器。但我不确定它是如何工作的。我有自己的理解 在内部工作。

我的理解:- 当开发人员对代码进行更改时(比如 class 员工),Eclipse 将 place/publish 修改后的编译 class 在网络服务器下的正确位置(必须是特定的 web/app 服务器。我们称之为热部署目录(HDD))。现在 Web 服务器特定 class 加载程序将出现。它会在 HDD 下找到新条目。现在,它发现如果 class 已经被 perm gen space 中的 classloader 加载,web 服务器将从 permgen space 中卸载它并在没有服务器的情况下在内部加载新的重新启动以便反映新的更改(字节代码)。作为重新加载的一部分,网络服务器还将 link 现有的 Epmloyee 对象与 perm gen space 中的新 class 定义,以便反映新的更改。

我的理解对吗?

有些 link 像 this 说 Eclipse 热部署只是重新部署的自动化。我认为这意味着 eclipse 会自动停止服务器,重新发布并重新启动它而无需开发人员干预。 但我认为这不是真的,因为与 start/publish/restart 相比,这个过程真的很快。 此外,如果它是真的,会话和其他活动对象将如何在重启后保持活动状态? 可能这 link 在过去是真的但现在不是,因为我发现热部署适用于 class罐子里也有

热代码部署取决于运行时能力。您 linked 的回答并不意味着自动停止服务器部署新代码并再次启动服务器。这会很浪费。

相反,大多数 Java 应用程序服务器能够 重新部署 应用程序。这意味着服务器将创建一个新的 Web 应用程序 class 加载器,通过这个新的 class 加载器加载应用程序的新版本,在某些情况下它会迁移状态(serialize/deserialize HTTP 会话), 并删除旧版本的应用程序。

现在重新部署速度在很大程度上取决于应用程序本身——应用程序是如何初始化的。它必须预热缓存吗?是否必须满足依赖关系(a-las Spring, CDI)?它是否必须初始化 Hibernate SessionFactory?涉及很多因素。

Eclipse WTP 自然会做的是它可以触发应用程序容器的重新部署过程 - 仅此而已。当然,一个小的应用程序不会花很长时间重新部署。

除非有一个特殊的运行时 technology/container/framework 并且有一个为 Eclipse 开发的特殊连接器来利用一个钩子,该钩子会触发针对该特定技术更新的热代码。 OSGi 运行时的 bndtools 就是一个很好的例子。

为了消除一些混乱:

人们经常混淆 HotSwap 热部署 。第一个,HotSwap,是 JVM 在运行时更新 class 定义的能力。后一种,热部署,是应用服务器自动部署应用程序的能力,无论是增量部署还是非增量部署,都不需要重新启动 JVM 进程。

所以我的回答是关于热部署,而不是关于 HotSwap。因此,我将热部署称为 "automation" 而不是平台的基本机制。