最近在做公司的麒麟项目的权限模块,发现一个很大的问题,及时因为项目当中用到了分布式,不是一个单一的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属性的名字)
领取专属 10元无门槛券
私享最新 技术干货