热部署热加载

最近在做公司的麒麟项目的权限模块,发现一个很大的问题,及时因为项目当中用到了分布式,不是一个单一的web项目,加上dubbo的注册时间,因为我拿到的是一个空的框架所以加载起来时间还是比较短的,但是依然需要好几分钟,整个项目才可以启动!有时间我只是修改了一个sql 但是。。。。。我要重新启动整个项目,这样一天就要好几次,每次都是要等!所以,一咬牙,有跺脚学习一下热加载和热部署吧!

A: 先看相同点:1.不需要重新启动服务器/部署项目2.基于Java的类加载器的实现。

B:区别:1.热部署在服务器运行时重新部署项目

2.热加载在运行时重新加载class文件

C:实现原理:热部署直接重新加载整个应用

热加载在运行时重新加载class(依赖类的加载机制,在容器启动的时候后台会启动一个线程,定时间的检测类时间戳的变化,如果累的时间戳发生了变化,就将类重新带入,侧重的是运行时通过重新加载改变类的信息,直接改变程序的行为)

D:使用场景:热部署更多的是在生产环境使用(频繁的部署,耗时长的应用,无法停止服务的应用)

热加载则更多的是在开发的环境使用(节省开发的时间和调试的时间)

初始化的时机:

遇到new static get post static invoke static 字节码指令的时候没有初始化则需要先初始化

final 修饰的类即使在调用的时候也不会初始化,final修饰的是常量,在编译的时候会把结果放进常量池里面,调用的常量不会触发初始化的方法

java.lang.reflect里面的反射,对类进行反射调用,如果类没有进行初始化,那么就要先对类进行初始化

当初始化一个类的时候,如果发现其父类还没有进行初始化,那么就要先触发其父类的初始化(调用子类的时候,如果其父类没有进行初始化,应该先初始化父类,在初始化子类)

虚拟机启动的时候,用户制定了一个要执行的主类,那么虚拟机会先初始化这个主类(例如我们写一个main方法那么虚拟机就会先初始化main方法所在的类)

jdk1.7的动态语言支持 java.lang.invoke.method.handle实例最后的解析的结果是ref_getStaic,ref_postStatic,ref_invokeStatic方法句柄的时候,如果句柄对用的类没有初始化,需要先初始化句柄对用的类

Java类的热部署

通过类的热加载,来实现热部署

a:

配置Tomcat

a:直接把项目放在web文件夹放在webapps里

(这是tomcat自带热部署)

b:在tomcat\conf\server.xml中的内部添加标签

c:在%tomcat_home%\conf\Catalina\localhost中添加xml

a:创建一个xml文件,里面的内容

b:将问价放到了此位置

c:把项目放在指定的web文件夹下面,不需要把项目真个过去,只需要把META-INF,WEB-INF考过去就可以!(服务器会用xml文件的名称,来作为path属性的名字)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180530G0OJFZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券