寫java代碼 時候打包部署是個很頭疼的問題,很是打擊寫代碼計程車氣,decvm的使用能夠很好的提高開發自測的效率,尤其是web類應用。收集了java中介軟體團隊和阿里巴巴團隊的兩片部落格,對於這個的使用做了介紹,希望做java web開發的可以使用一下呵呵。
----------------------------------------------------------------------------------------
關於hotswap(該補丁的網址http://ssw.jku.at/dcevm/)
Hotswap 是一個允許在運行狀態下無限制的修改載入類檔案的Java虛擬機器補丁。當前java虛擬機器的動態載入機制只允許修改類的方法體,而打了hotswap補丁以後,可以增加,刪除類屬性,方法,甚至可以改變一個類的父類。
Hotswap補丁是基於GPL v2.0開源協議的。你可以通過windows,linux,mac os下載hotswap 補丁的原始碼或者可執行檔。
安裝hotswap
警告: 該補丁目前還處於實驗階段. 當該補丁用於調試java程式使用是,是相當穩定的。但我們不提倡在生產環境中使用該補丁。
現在提供了 32位, 64位 Windows虛擬機器, 32位 Mac OS的 (從這裡獲得), 和32位 Linux 虛擬機器的補丁. 所有的修改基於 JDK7-b102版本。 安裝程式 dcevm-0.2-win.jar (5.6 MB) dcevm-0.2-mac.jar (6.0 MB) dcevm-0.2-linux.jar (5.8 MB)
該補丁不僅能打在java7上,且打到java 6上,也一樣正常工作。
在windows 啟動安裝程式,在控制台輸入:
> java -jar dcevm-0.2-win.jar
在Mac OS啟動安裝程式,終端輸入:
$ sudo java -jar dcevm-0.2-mac.jar
在Mac OS啟動安裝程式,終端輸入:
$ sudo java -jar dcevm-0.2-linux.jar
安裝程式會替換掉java下 bin/client/jvm.dll 和 bin/server/jvm.dll ,並將以後的jvm.dll備份到相應目錄下。還會將dcevm.jar 加到lib/ext/ 目錄.
圖一:hotswap補丁安裝介面。
執行上述命令後,就會出現圖一介面,選擇將要安裝該補丁的java目錄,單擊安裝就可以了。
Ps:如果你的Linux沒有圖形介面,您可以從這裡下載已經打好補丁的java。
使用hotswap調試java程式
首先用修改後的java以debug模式啟動 java程式。 使用eclipse串連到該java進程(也可以直接在eclipse中以debug方式啟動) 現在在eclipse 工程下面針對class檔案的任何修改將會直接反映到java程式中去。
hotswap在淘寶
令我們高興的是,淘寶開發人員對該技術有著強烈的興趣,目前已有如下團隊使用的該補丁:MytaobaoTeam Dev,TDDL(Rtools)Team Dev,HSFTeam Dev,交易中心等團隊。
------------------------------------------------------------------------------------------------
目前,國際站目前還是主要在幾個應用上,一個應用多的有三四十萬行代碼。幾乎所有的產品線在這個應用上都有代碼;採用分支開發,要改的代碼可能只有一點也要Check out出整個工程的代碼來。
這樣大工程,對於開發效率的影響很大,編譯一下10分鐘,啟動一下5分鐘。苦悶的等待是時間的浪費,另一方面也是打斷了開發的節奏。開發過程中,每修改了一點內容,就要編譯工程、重啟應用來驗證。每個開發員都會要頻繁重啟,浪費總量上是巨大的。
當然解決大應用的關鍵是拆根據功能拆分成小應用,這件事國際站也在積極進行中。
Hot Swap可以在Debug時讓對源檔案的修改立即生效,減少編譯和重啟的次數,節省開發時間浪費。
Java虛擬機器的預設的Hot Swap機制只允許修改類的方法體,這個限制太大。
DCE(the Dynamic Code Evolution VM)是一個允許在運行狀態下無限制的修改載入類檔案的Java虛擬機器補丁,即Hot Swap的加強。使用DCE以後,可以 增加、刪除 類的屬性、方法 改變一個類的父類
這樣的加強,完全滿足平時開發時需要。DCE是基於GPL v2.0開源協議的。你可以通過Windows,Linux,Mac OS下載DCE的原始碼或者可執行檔。
下面記錄了DCE使用中遇到的和整理了網上提到的對DCE的問題及其解決。 DCE注意
Linux下,DCE目前只支援32位JVM,不支援64位JVM。
與JDK 1.6 update 26有相容問題,使用JDK 1.6 update 25。
# 參見官網 http://ssw.jku.at/dcevm/binaries/ 的說明。
問題及其解決方案
下面是在國際站開發環境整合DCE的過程中,收集的問題以及解決方案的記錄總結和匯總。
1. 和asm、cglib相關的jar包衝突。
異常:
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47) at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30) at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24) at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104) at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69) at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:117) at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)
參見DCE的JIRA http://kenai.com/jira/browse/DCEVM-4
原因:dcevm.jar檔案中包含了一份ASM類,版本較老,並優先載入。(阿幹發現這個問題,並給出重新命名包名的解決方案)
解決方案1:
重新命名dcevm.jar檔案中asm的包名,從 org.objectweb.asm 重新命名成 dce.org.objectweb.asm。
# 在Jar檔案上重新命名包名 使用工具: JarJar(http://code.google.com/p/jarjar/)。
解決方案2:
asm、cglib換成了新的版本:asm-3.3.1.jar、cglib-nodep-2.2.jar。
asm、cglib各版本匹配注意點:
asm 1.5.3.jar 匹配 cglib-2.1.3.jar
asm-2.X.jar asm-3.x.jar 匹配 cglib-nodep-2.1_3.jar
2. 動態添加的static屬性,例如 private static String attrib1 = "x",調用時會顯示attrib1是null。
3. 在一個正在執行的迴圈中,改變可能不能生效。例如:
public static void main(String[] args) { for (int i = 0; i < 10000; i++) { test(); //sleep 1s and print something }}
修改為:
public static void main(String[] args) { for (int i = 0; i < 10000; i++){ test(); System.out.println("xxx"); }}
xxx是不能輸出的。
但test方法體內部的修改是可以生效的。例如:
public static void main(String[] args) { System.out.println("xxx"); for (int i = 0; i < 10000; i++) { test(); }}
5. Crash when running maven test goal with jmockit
參見DCE的JIRA http://kenai.com/jira/browse/DCEVM-3
6. DCEVM啟動報錯
Must use the serial GC in the Dynamic Code Evolution VMCould not create the Java virtual machine.
把JAVA啟動參數中並發GC的選項刪除,如:
-XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode-XX:+CMSIncrementalPacing-XX:CMSIncrementalDutyCycleMin=0-XX:CMSIncrementalDutyCycle=10
開發模式下,修改這些選項不會有功能上的影響。
一些參考資料 DCE官方網址 http://ssw.jku.at/dcevm/ hotswap 使用者手冊 – 淘寶JAVA中介軟體團隊部落格http://rdc.taobao.com/team/jm/archives/641 hostswap dcevm – 使用介紹http://www.cnblogs.com/redcreen/archive/2011/06/03/2071169.html Dynamic Code Evolution for Java dcevm 原理http://www.cnblogs.com/redcreen/archive/2011/06/14/2080718.html Java HotSpot dcevm 在debug模式下的熱部署http://sjsky.iteye.com/blog/907606 深入 Java 調試體系 http://www.ibm.com/developerworks/cn/java/j-lo-jpda1/ Java Platform Debugger Architecturehttp://java.sun.com/javase/technologies/core/toolsapis/jpda/