java热部署深入探索

java热部署深入探索

ID:30769052

大小:136.26 KB

页数:10页

时间:2019-01-03

java热部署深入探索_第1页
java热部署深入探索_第2页
java热部署深入探索_第3页
java热部署深入探索_第4页
java热部署深入探索_第5页
资源描述:

《java热部署深入探索》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、简介在Java开发领域,热部署一直是一个难以解决的问题,口前的Java虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。对于某些人型的应用來说,每次的重启都需要花费人量的时间成本。虽然osgi架构的出现,让模块垂启成为可能,但是如果模块之间冇调川关系的话,这样的操作依然会让应用出现用桝的功能性休克。本文将探索如何在不破坏Java虚拟机现有行为的前提下,实现某个单一类的热部署,让系统无需重启就完成某个类的更新。类加载的探索首先谈一下何为热部署(hotswap),热部署是在不重

2、启Java虚拟机的前提下,能占动侦测到class文件的变化,更新运行时class的行为。Java类是通过Java虚拟机加载的,某个类的class文件在被classloadcr加载后,会生成对应的Class对象,之后就可以创建该类的实例。默认的虚拟机行为只会在启动时加载类,如果后期有一个类需要更新的话,单纯替换编译的class文件,Java虚拟机是不会更新正在运行的class。如果要实现热部署,最根木的方式是修改虚拟机的源代码,改变classloader的加载行为,使虚拟机能监听class文件的更新,重新加载class文件,这样的

3、行为破坏性很大,为后续的JVM升级埋下了一个大坑。另一•种友好的方法是创建自己的classloader來加载需要监听的class,这样就能控制类加载的时机,从而实现热部署。本文将具体探索如何实现这个方案。首先需要了解一下Java虚拟机现冇的加载机制。冃前的加载机制,称为双亲委派,系统在使用一个classloader來加载类时,会先询问当前classloadcr的父类是否冇能力加载,如果父类无法实现加载操作,才会将任务下放到该classloader来加载。这种自上而下的加载方式的好处是,让每个classloadcr执行自己的加载任

4、务,不会重复加载类。但是这种方式却使加载顺序非常难改变,让自定义classloader抢先加载需要监听改变的类成为了一个难题。不过我们可以换一个思路,虽然无法抢先加载该类,但是仍然口J以川自定义classloader创建一个功能相同的类,讣每次实例化的对象都指向这个新的类。当这个类的class文件发&改变的时候,再次创建一个更新的类,之后如果系统再次发出实例化请求,创建的対象讲指向这个全新的类。卜•而來简单列举一下需要做的工作。•创建口定义的classloader,加载需要监听改变的类,在class文件发生改变的吋候,重新加载该

5、类。•改变创建对象的行为,使他们在创建时使用自定义classloader加载的classo自定义加载器的实现自定义加载器仍然需要执行类加载的功能。这里却存在一个问题,同一个类加载器无法同时加载两个相同名称的类,由于不论类的结构如何发生变化,生成的类名不会变,而classloader只能在虚拟机停止前销毁已经加载的类,这样classloader就无法加载更新后的类了。这里有一个小技巧,让每次加载的类都保存成一个带有版本信息的class,比如加载Test.class吋,保存在内存中的类杲Test_vl.class,当类发生改变时,重

6、新加载的类名是Test_v2.classo但是真止执行加载class文件创建class的dcfincClass方法是一个native的方法,修改起来又变得很因难。所以面前还剩一条路,那就是直接修改编译生成的class文件。利用ASM修改class文件可以修改字节码的框架有很多,比如ASM,CGLIBo本文使用的是ASMo先來介绍一下class文件的结构,class文件包含了以下儿类信息,一个是类的基本信息,包含了访问权限信息,类名信息,父类信息,接口信息。第二个是类的变量信息。第三个是方法的信息。ASM会先加载一个class文件

7、,然后严格顺序读取类的各项信息,用户可以按照自己的意愿定义增强组件修改这些信息,最后输出成一个新的classo首先看一下如何利用ASM修改类信息。清单1.利用ASM修改字节码Classwritercw=newClasswriter(Classwriter.COMPUTE_MAXS);ClassReadercr=null;StringenhancedClassName=classsource.getEnhancedName();try{cr=newClassReader(newFileinputstream(cl

8、assSource.getFile()));}catch(IOExceptione){e.printStackTrace();returnnull;Classvisitorcv=newEnhancedModifier(cw,className・replace(H

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。