<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 42,comments - 83,trackbacks - 0
            在一個運營系統(tǒng)中,如果出現(xiàn)業(yè)務(wù)方法變更,而我們使用的應(yīng)用服務(wù)器不支持熱部署的話,那么重啟可能是更新的唯一選擇。目前多數(shù)應(yīng)用服務(wù)器不支持熱部署,包括生產(chǎn)模式下的weblogic。之所以說是生產(chǎn)模式,weblogic在開發(fā)模式下是支持這種動態(tài)更新的,即我們只要替換部署目錄下的類文件,重新訪問時可以看到新業(yè)務(wù)方法生效,而且即使在生產(chǎn)模式下,weblogic也能"支持"動態(tài)更新,但做法上比較麻煩,需要使用version信息控制應(yīng)用,這個功能weblogic9就開始提供,但好像很少有客戶這么用過。如果應(yīng)用服務(wù)器不支持動態(tài)更新,我們有什么方法可以滿足這種需求嗎? 這就是我們這篇文章要講述的,通過TI(更準(zhǔn)確地說是JDI),我們可以實現(xiàn)。

            為了能夠正確的做到動態(tài)更新,我們首先需要attach到target JVM上,具體方法參考http://www.tkk7.com/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:確保要更新的類在當(dāng)前classpath下(也就是啟動VMDebugger的classpath)。
             2:確保要更新的類在target JVM已被加載。
             3:不同的VM實現(xiàn)上不一樣,有的可能不允許動態(tài)更新,可以使用canRedefineClasses()
    判斷一下。
    posted on 2009-09-11 00:04 走走停停又三年 閱讀(2788) 評論(5)  編輯  收藏 所屬分類: Java Technology

    FeedBack:
    # re: JVM TI學(xué)習(xí)(2)----如何動態(tài)更新JVM中的class文件
    2009-09-10 23:22 | Ken Wu
    你這是instrumentation吧?TI的使用還不太一樣。  回復(fù)  更多評論
      
    # re: JVM TI學(xué)習(xí)(2)----如何動態(tài)更新JVM中的class文件[未登錄]
    2009-09-11 12:16 | 禮物
    用javassist 里面的一個hotswap也可以的~~  回復(fù)  更多評論
      
    # re: JVM TI學(xué)習(xí)(2)----如何動態(tài)更新JVM中的class文件
    2009-09-11 12:17 | 摩卡主機
    提供做好的java虛擬主機 獨立tomcat 獨立jvm  回復(fù)  更多評論
      
    # re: JVM TI學(xué)習(xí)(2)----如何動態(tài)更新JVM中的class文件
    2009-09-11 12:31 | 走走停停又三年
    @禮物
    學(xué)習(xí)了,謝謝 :)
      回復(fù)  更多評論
      
    # re: JVM TI學(xué)習(xí)(2)----如何動態(tài)更新JVM中的class文件
    2009-09-13 12:34 | 凡客誠品
    學(xué)到東西了~謝謝  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲日本天堂在线| 成在人线av无码免费高潮水| 免费jlzzjlzz在线播放视频| 一区免费在线观看| 亚洲av中文无码乱人伦在线r▽| 国产成人免费在线| 国产精品亚洲综合网站| 亚洲AV日韩精品久久久久久久 | 中文字幕免费播放| 亚洲成aⅴ人在线观看| 全亚洲最新黄色特级网站 | 黄色视频在线免费观看| 亚洲精品美女在线观看播放| 日韩在线a视频免费播放| 国产真人无码作爱视频免费| 亚洲午夜无码久久久久小说| 亚洲综合网站色欲色欲| 无码人妻精品一二三区免费| 国产日韩精品无码区免费专区国产 | 亚洲国产成人精品女人久久久| 免费国产黄网站在线观看视频| 国产AV无码专区亚洲AV蜜芽| 国产真人无码作爱视频免费| 亚洲精华国产精华精华液| 久久精品国产精品亚洲艾| 免费中文字幕一级毛片| 84pao国产成视频免费播放| 天堂亚洲免费视频| 亚洲高清中文字幕免费| 亚洲精选在线观看| 国产性爱在线观看亚洲黄色一级片| 歪歪漫画在线观看官网免费阅读| a毛片在线免费观看| 黄色一级视频免费观看| 亚洲第一男人天堂| 亚洲美女激情视频| 亚洲精品国产品国语在线 | 亚洲av乱码一区二区三区| 国产亚洲精品va在线| 亚洲国产日韩在线观频| 精品国产一区二区三区免费看|