实现原理
热部署:直接重新加载整个工程
热加载:在运行时重新加载字节码文件(基于classloader)
Java热部署和热加载的联系
不重启服务器编译/部署项目
基于Java的类加载器实现
部署方式上的区别
热部署在服务器运行时重新部署项目(不用重启服务器)—节省运维时间,提高效率。
热加载在运行时重新加载class.(Java字节码文件)—当Java类做了一定的修改时, 不需要重启服务, 编译后的字节码文件就可以更新同步。
类加载的五个阶段 加载:找到java的静态存储结构并加载到虚拟机内,转换为方法区运行时使用的数据结构,生成class对象,用户可以自定义类加载器参与进来 验证:确保字节码是安全的,确保不会对虚拟机造成危害,可以通过虚拟机的启动参数来禁用一些验证(不推荐) 准备:确定内存布局,初始化类变量,是赋初始值(例如:静态变量等赋为0),不会执行方法中赋值语句 解析:将符号引用变为直接引用 初始化:调用程序自定义代码(例如:静态变量真正赋值为12)
5种初始化:
1.遇到new,get, static这几条字节码指令,如果类没有初始化,则需要触发初始化。final修饰的类会在编译时把结果放到常量池中,即使调用也不会触发初始化。final关键字它修饰的是常量。 2.使用反射对类进行反射调用,如果类没有进行初始化,就需要先初始化 3.当初始化一个类的时候,如果发现其父类还没有进行过初始化,需要先触发父类的初始化。先初始化父类,在初始化子类。 4.虚拟机启动的时候用户需要制定一个要执行的主类,虚拟机会先初始化这个主类。 5.使用jdk1.7动态机制相关的句柄会进行初始化。
java类加载器特点
1、由AppClass Loader (系统类加载器)开始加载指定的类
2、类加载器将加载任务交给其父,如果其父找不到,再由自己去加载
3、Bootstrap Loader(启动类加载器)是最顶级的类加载器(BootstrapClassLoader是C++实现的,其没有对应的Java子类,只是名义上的所有类加载器父类,因为在ClassLoader中当parent委托对象为null的话会默认BootstrapClassLoader为parent)
Java类的热部署
一、类的热加载
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException{
System.out.println("加载类===" + name );
byte[] data =loadClassData(name);
return this.defineClass(name,data,0,data.length);
}
二、配置Tomcat
1、直接把项目web文件夹放再webapps里。
2、在tomcatconfserver.xml中的<host></host>内部添加<context/>标签。
<Context debug="0" docBase="D:/Imooc/web" path="/hot" privileged="true" reloadable="true"/>
3、在%tomcat_home%confCatalinalocalhost中添加一个XML
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:/Imooc/web" reloadable="true"/>