热加载和热部署

目录

 

一 什么是热加载和热部署

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 热部署会清空内存;热加载不会清空内存,有内存溢出风险

 

你可能感兴趣的:(Java虚拟机专题,Java/核心,热加载,热部署,类加载器)