热部署原理解析

一、Java类加载过程


把Java文件编译成字节码文件,再把字节码文件序列化成相应的串,再把序列化后的串编译成源码对象,再把源码对象编译成.class文件,classload加载器加载class类到Java虚拟机中。

类加载的5个阶段:


加载阶段

找到类的静态存储结构,并加载到虚拟机里面,然后转换成方法区的运行时数据结构,生成class对象,加载阶段,用户可以自定义类加载器参与进来。

验证阶段

主要确保字节码安全的,确保不会对虚拟机安全造成危害,通过JVM启动参数来禁用一些验证,但不推荐修改设置,参数禁用会对虚拟机安全可能造成一些危害。

准备阶段

确定内存布局,初始化内存变量,注意点:赋初始值,不会执行程序自己定义的赋值操作,比如定义了一个私有变量:private static int count = 12,在准备阶段并不是把count初始为了12,这里是会赋初始值,int初始值为0,所以会把这私有静态变量赋值为0,而不是12。

解析阶段

这个阶段主要是将符号引用变为直接引用。

初始化阶段

调用程序自定义的代码。比如private static int count = 12, count在本阶段将会被初始化为12,而不是之前准备阶段的0,初始化阶段会生成clean int 方法,这个方法由编译器自动收集类中的所有类变量的赋值、动作和静态语句块中的语句合并,同一个类加载器中,只会将一个类型初始化一次,Java虚拟机没有强制约束什么时候开始初始化阶段,但规定了5种情况必须立即初始化,当然这之前的几种操作都是已经运行了的。5种情况如下:

1. 遇到new、 get static 、post static、 invoke static这四条字节码指令的时候,如果类没有初始化,需要触发初始化,注意的是final修饰的类,会在编译期的时候,将结果放在常量池,即使调用也不会触发初始化,因为final修饰的是常量,会把常量放在常量池,调用常量不会触发初始化这个阶段。

2. 使用java.long.reflect包里方法,即对类进行反射调用的时候,如果类没初始化的话,需要初始化。

3. 当初始化一个子类的时候,如果父类还没有初始化,需要先初始化父类,再初始化子类

4. 虚拟机启动的时候,用户制定一个要执行的主类,虚拟机会先初始化这个主类,例子:我们写的java程序,在某一个类里面写了一个main方法,通过运行这个main方法启动这个程序,虚拟机会先初始化这个main方法所在的类。

5. 使用jdk1.7动态语言支持的时候,如果java.lang.invoke.methondhandler类实例解析的最后结果是ref_getstatic、ref_putstatic、ref_invokestatic方法句柄的时候,如果句柄对应的类没有初始化,那就需要先初始化句柄对应的类。

二、Java类加载器的特点

1. 由AppClass Loader(系统类加载器)开始加载指定的类;

2. 类加载器将加载任务交给其父,如果其父找不到,再交给自己去加载;

3. Bootstrap Loader (启动类加载器)是最顶级的类加载器。

三、Java类热部署实现方式

1. 类的热加载实现热部署


这个方式主要通过继承java.lang.classloader这个类,复写findClass方法,这个方法目标是为自定义加载器容纳所有的代码,不需要重复写其他的代码,例如加载失败时,调用系统的classloader是不需要的。classLoader需要从源文件中获取字节码,一旦找到字节码会调用defineClass方法,classLoader实例调用此方法也是非常重要的,因此,如果两个class实例定义来自不同和相同文件的字节码,则被定义的类也被区别对待,因为一个类加载器只能初始化一次。

2. 配置Tomcat实现热部署

1.直接把项目web文件夹放在webapps里面。

2. 在tomcat/conf/server.xml文件里面的<host></host>内部添加<context/>标签,有这个context标签的一些属性经过一些配置实现热部署。

3. 在%tomcat_home%\conf\Catalina\localhost里面添加一个xml文件,注意的是,访问的时候以localhost中添加的一个xml的名字作为路径一部分来访问的。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值