实现原理热部署:直接重新加载整个工程热加载:在运行时重新加载字节码文件(基于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类的热部署 一、类的热加载
@Overrideprotected 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、在tomcat\conf\server.xml中的内部添加 标签。
3、在%tomcat_home%\conf\Catalina\localhost中添加一个XML