背景

在Java开发过程中,每次修改代码后需要重新部署才能看到看到效果,部署的时间往往比较长,对开发效率和体验的影响都比较大。对于Java开发,热部署一直是一个老大难的问题,目前的Java虚拟机只能实现方法体的修改热部署,对于整个类结构的修改,仍然需要重启虚拟机,对类重新加载才能完成更新。
在讨论这个问题的时候热部署和热加载这两个词往往会交叉出现,甚至让一些新人比较迷惑,在这简单做个定义:
热部署就是在服务器运行时重新部署项目,——生产环境
热加载即在在运行时重新加载class,从而升级应用。——开发环境

热加载原理

简单说 spring-boot-devtools 是使用了两个ClassLoader,一个加载不会改变的类(第三方Jar包),另一个加载会更改的类,称之为restart ClassLoader。在代码修改的时候,原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader。由于需要加载的类比较少,重启时间也比较短。
代码修改检测则是spring-boot-devtools通过启动一个后台线程监听classpath下的文件变动,为每一个类文件打上时间戳,如果时间戳变化,则将类重新载入

image.png

热部署原理

热部署原理类似,但它是直接重新加载整个应用,这种方式会释放内存,比热加载更加干净彻底,但同时也更费时间。要实现不停服在线更新也更麻烦,具体原理等更熟悉之后再补充

参考文章

Developer tools: https://docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/html/using-boot-devtools.html#using-boot-devtools-restart-exclude

Using Spring Boot: https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-using-springbootapplication-annotation

springboot实现热部署:https://juejin.im/post/5c963ec3f265da60e92684bc

SpringBoot配置devtools实现热部署: https://www.cnblogs.com/lspz/p/6832358.html

springboot热部署(一)——Java热部署与热加载原理: https://www.cnblogs.com/jiangbei/p/8438733.html

SpringBoot 热部署: https://zhuanlan.zhihu.com/p/89974323