快速业务通道

JVM TI学习(2) 如何动态更新JVM中的class文件 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

JVM TI学习(2) 如何动态更新JVM中的class文件

时间:2010-12-26 BlogJava 走走停停又三年

在一个运营系统中,如果出现业务方法变更,而我们使用的应用服务器不支持热部署的话,那么重启可能是更新的唯一选择。目前多数应用服务器不支持热部署,包括生产模式下的weblogic。之所以说是生产模式,weblogic在开发模式下是支持这种动态更新的,即我们只要替换部署目录下的类文件,重新访问时可以看到新业务方法生效,而且即使在生产模式下,weblogic也能"支持"动态更新,但做法上比较麻烦,需要使用version信息控制应用,这个功能weblogic9就开始提供,但好像很少有客户这么用过。如果应用服务器不支持动态更新,我们有什么方法可以满足这种需求吗?这就是我们这篇文章要讲述的,通过TI(更准确地说是JDI),我们可以实现。

为了能够正确的做到动态更新,我们首先需要attach到target JVM上,具体方法参考http://www.blogjava.net/fjin/archive/2009/09/10/294443.html

连接上target JVM后,我们可以就可以利用vm提供的redefineClasses()将新的类文件注入到JVM中,替代原有的class信息。

1     public void reloadClasses(List toReloads){ 2         Map toReloadMap = new HashMap(); 3         for (Iterator iterator = toReloads.iterator(); iterator.hasNext();) 4         { 5             String toReload = (String) iterator.next(); 6             InputStream is = VMDebugger.class.getClassLoader().getResourceAsStream(toReload.replace(''.'', ''/'') + ".class"); 7             if (is == null) { 8                 throw new RuntimeException("Class " + toReload + " is not found in current classpath"); 9             } 10             List classes = vm.classesByName(toReload); 11             if (classes == null || classes.isEmpty()) { 12                 throw new RuntimeException("Class: " + toReload + " is not found in target JVM"); 13             } else { 14                 ReferenceType ref = (ReferenceType) classes.get(0); 15                 try{ 16                     toReloadMap.put(ref, toByteArray(is)); 17                 }catch(Exception e){ 18                     e.printStackTrace(); 19                 } 20             } 21         } 22         vm.redefineClasses(toReloadMap); 23     }

上面的方法有如下几个注意的地方:

1:确保要更新的类在当前classpath下(也就是启动VMDebugger的classpath)。

2:确保要更新的类在target JVM已被加载。

3:不同的VM实现上不一样,有的可能不允许动态更新,可以使用canRedefineClasses() 判断一下。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号