程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JVM TI學習(2) 如何動態更新JVM中的class文件

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() 判斷一下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved