1. 热部署和热加载
热部署
- 在服务器运行的时候重新部署项目
- 直接重新加载整个项目,这种方式会释放内存,比热加载更加干净彻底,但是也更加耗时
热加载
- 在运行的时候重新加载class,从而升级应用
- 热加载的实现原理主要是依赖于
Java
的类加载机制,在实现方式上就是概括在容器启动的时候,启动一条后台线程,定时检测类文件的时间戳变化,如果类的时间戳变化了,那么就执行类的重新载入
热加载和反射都是对类进行操作,有什么区别?
热加载
:比较复杂,从JVM的角度来说,就是卸载了这个类,然后执行IO,将新的类文件加载进内存中
反射
:操作已经在内存中的类
2. 热部署的原理是什么?
为什么同样是重启应用,为什么不手动重启,而是建议使用spring-boot-devtools
进行热部署重启?
spring-boot-devtools
使用了两个类加载器,一个ClassLoader
加载不会发生更改的类(第三方的jar包),另外一个ClassLoader(restart Loader)
加载会更改的类
具体来说,原理是开启一个后台守护线程(File Watcher)
,检测中目录的文件发生改动的时候,原来的restart ClassLoader会被丢弃
,将会重新加载新的restart classLoader
因为文件变动之后,第三方的jar包不再重新加载,只加载自定义的类,这些类的数量较少,所以他们的重启比较快
使用JRebel
https://blog.csdn.net/weixin_42694593/article/details/126448828?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168351754416800211520818%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168351754416800211520818&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-126448828-null-null.142^v86^insert_down1,239^v2^insert_chatgpt&utm_term=jrebel%E7%83%AD%E9%83%A8%E7%BD%B2&spm=1018.2226.3001.4187