目录
一 什么是热加载和热部署
1.1 热部署(Hot Deploy)
1.2 热加载(Hot Swap)
二 热加载的原理是什么
2.1 检测哪些文件需要重新被加载
2.2 怎么加载
三 热部署的原理是什么
四 区别
一 什么是热加载和热部署
1.1 热部署(Hot Deploy)
热部署针对的是容器或者是整个应用,部署了新的资源或者修改了一些代码,需要在不停机的情况下的重新加载整个应用。
1.2 热加载(Hot Swap)
热加载针对的是单个字节码文件,指的是重新编译后,不需要停机,应用程序就可以加载使用新的class文件
二 热加载的原理是什么
2.1 检测哪些文件需要重新被加载
如果应用系统简单的话,可以开启一个单独的线程,间隔时间内重新加载所有的class文件。
如果稍微大一点的话,需要考虑性能,尽量识别出哪些需要被热加载,比如根据class文件最新更新时间判断等等
因为他不会清理内存吗,所以有内存溢出的风险,所以成熟的热加载软件或者系统都会有对应的方案来处理。
2.2 怎么加载
自定义一个类加载器,注意URLClassLoader不能用,因为URLConnection里面设置了缓存,无法有效加载新的class文件。可以继承ClassLoader,然后重写findClass方法。
public class MyClassLoader extends ClassLoader {
//要加载的java类的classpath路径
private String classPath;
public MyClassLoader( String classPath) {
super(ClassLoader.getSystemClassLoader());
this.classPath = classPath;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] data = this.loadData(name);
//返回加载后的Class对象
return this.defineClass(name, data, 0, data.length);
}
private byte[] loadData(String name) {
try {
name = name.replace(".", "/");
FileInputStream is = new FileInputStream(new File(classPath + "/" +name + ".class"));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int b = 0;
while ((b = is.read()) != -1) {
bos.write(b);
}
is.close();
return bos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String getClassPath() {
return classPath;
}
public void setClassPath(String classPath) {
this.classPath = classPath;
}
}
public class HotSwapMain {
public static void main(String[] args) throws Exception{
while (true) {
MyClassLoader classLoader = new MyClassLoader("E:/code/ecom-review-core/target/classes");
Class<?> clazz = classLoader.loadClass("com.core.jvm.hotload.HotSwap");
Object newInstance = clazz.newInstance();
clazz.getMethod("output").invoke(newInstance);
Thread.sleep(2000);
}
}
}
三 热部署的原理是什么
热部署是加载整个应用程序,包括运行需要使用到的各种文件,比如Jar包,JS或者CSS或者html等静态文件或者一些配置文件等。我们以tomcat为例,它首先校验是否开启了热部署,并且发生了修改,它有一个后台线程,定期进行reload检测,如果检测需要重新部署,即热部署,则先停止,然后启动,这期间会清理session,清空内存。
四 区别
#1 热部署是针对整个应用,包括Jar包,class文件,配置文件等;热加载只针对class文件
#2 热部署会清空内存;热加载不会清空内存,有内存溢出风险