深入探索Java热部署编程小技巧.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入探索Java热部署编程小技巧.doc

深入探索Java热部署 在Java开发领域,热部署一直是一个难以解决的问题,目前的Java虚拟 机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需耍重启虚拟机, 对类重新加载才能完成更新操作。对于某些大型的应用来说,每次的重启都需要 花费大量的时间成本。虽然osgi架构的出现,让模块重启成为可能,但是如果 模块之间有调用关系的话,这样的操作依然会让应用出现短暂的功能性休克。本 文将探索如何在不破坏Java虚拟机现有行为的前提下,实现某个单一类的热部 署,讣系统无需重启就完成某个类的更新。 Java 类加载的探索 首先谈-下何为热部署(hotswap),热部署是在不重启Java虚拟机的前 提下,能自动侦测到class文件的变化,更新运彳亍时class的彳亍为。Java类 是通过Java虚拟机加载的,某个类的class文件在被classloader加载后, 会生成对应的Class对象,之后就可以创建该类的实例。默认的虚拟机行为只 会在启动时加载类,如果后期有一个类需要更新的话,单纯替换编译的class文 件,Java虚拟机是不会更新正在运行的classo如果耍实现热部署,最根木的 方式是修改虚拟机的源代码,改变classloader的加载彳亍为,使虚拟机能监听 class文件的更新,重新加载class文件,这样的行为破坏性很大,为后续的 JVM升级埋下了一个大坑。 另一种友好的方法是创建自己的classloader来加载需要监听的class, 这样就能控制类加载的吋机,从而实现热部署。木文将具体探索如何实现这个方 案。首先需要了解一-下Java虚拟机现有的加载机制。目前的加载机制,称为双 亲委派,系统在使用一个class loader来加载类时,会先询问当nV cl ass loader 的父类是否冇能力加载,如果父类无法实现加载操作,才会将任务下放到该 classloader来加载。这种自上而下的加载方式的好处是,让毎个classloader 执行自己的加载任务,不会重复加载类。但是这种方式却使加载顺序非常难改变, 让自定义classloader抢先加载需要监听改变的类成为了一个难题。 不过我们可以换一个思路,虽然无法抢先加载该类,但是仍然可以用自定义 classloader创建一个功能相同的类,让毎次实例化的对彖都指向这个新的类。 当这个类的class文件发生改变的吋候,再次创建一个更新的类,之后如果系 统再次发出实例化请求,创建的对象讲指向这个全新的类。 下而来简单列举一下需要做的工作。 ?创建自定义的classloader,加载需要监听改变的类,在class文件发生改变的时候, 重新加载该类。 ?改变创建对象的行为,使他们在创建时使用自定义classloader加载的classo 自定义加载器的实现 自定义加载器仍然需要执行类加载的功能。这里却存在一个问题,同-?个类 加载器无法同时加载两个相同名称的类,由于不论类的结构如何发生变化,生成 的类名不会变,而classloader只能在虚拟机停止前销毁已经加载的类,这样 classloader就无法加载更新后的类了。这里有一个小技巧,让每次加载的类都 保存成一个带有版本信息的class,比如加载Test, class时,保存在内存中的 类是Tcst_vl. class,当类发生改变时,重新加载的类名是Tcst_v2. classo但 是真正执行加载class文件创建class的defineClass方法是一个native 的方法,修改起來乂变得很困难。所以面前还剩一条路,那就是直接修改编译生 成的class文件。 利用ASM修改class文件 可以修改字节码的框架冇很多,比如ASM, CGLIBo本文使用的是ASMo先 来介绍一下class文件的结构,class文件包含了以下儿类信息,一个是类的 基木信息,包含了访问权限信息,类名信息,父类信息,接口信息。第二个是类 的变量信息。第三个是方法的信息。ASM会先加载一个class文件,然后严格 顺序读取类的各项信息,用户可以按照口己的意愿定义增强组件修改这些信息, 最后输岀成一个新的classo 首先看一下如何利用ASM修改类信息。 清单1.利用ASM修改字节码 ClassWritcr cw = new ClassWriter (ClassWriter. COMPUTE_MAXS); ClassReader cr = null; String enhancedClassName 二 classSource.getEnhancedName (); try { cr 二 new ClassReader(new Fi1eTnputStream ( classSource? gctFilcO)); } catch (lOExc

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档