当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:14:00  来源:本站整理

JVM TI学习(2) 若何动态更新JVM中的class文件[Java编程]

赞助商链接



  本文“JVM TI学习(2) 若何动态更新JVM中的class文件[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

在一个运营系统中,假如呈现业务办法变更,而我们利用的利用服务器不支持热布置的话,那么重启大概是更新的唯一挑选.目前大都利用服务器不支持热布置,包含生产情势下的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() 判断一下.


  以上是“JVM TI学习(2) 若何动态更新JVM中的class文件[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • JVM(Java虚拟机)详解
  • 关于JVM号令行标志您不知道的5件事:调优JVM性能和Java运行时
  • 扩大Axis2框架,支持基于JVM的脚本语言
  • Java理论与实践: JVM 1.4.1中的垃圾堆积
  • JVM TI学习(1) 若何中止weblogic中stuck thread
  • JVM TI学习(2) 若何动态更新JVM中的class文件
  • JVM(Java虚拟机)中进程工作目录讲授
  • 关于JVM的垃圾堆积(一)
  • 关于JVM的垃圾堆积(二)
  • 关于JVM的垃圾堆积(三)
  • 摸索JVM上的LISP
  • 操纵JRuby生成JVM代码
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .