"Dynamic Code Evolution for Java dcevm"發現一個NB的東西__Java

來源:互聯網
上載者:User

最近用debug模式偵錯工具出現了一些問題,修改java類,甚至修改html都得重啟tomcat,很是鬱悶。在網上搜尋的時候發現了一個好東西

不用不知道一用嚇一跳,真的很快,對開發效率有很大提高。原文:

hostswap dcevm

什麼是dcevm

       dcevm(DynamicCode Evolution Virtual Machine)是java hostspot的補丁(嚴格上來說是修改),允許(並非無限制)在運行環境下修改載入的類檔案.當前虛擬機器只允許修改方法體(method bodies),decvm,可以增加 刪除類屬性、方法,甚至改變一個類的父類。原理參見Dynamic Code Evolution for Java dcevm 原理

       dcevm 是一個開源項目,遵從GPL 2.0。源檔案及執行檔案都可從官網下載。

       注意:Currently, the binary version of the VM is available for the 32-bit and 64-bit Windows VM, 32-bit Mac OS Soylatte VM (get it here), and 32-bit Linux VM. We plan to add binaries for 64-bit Mac and Linux VMs.Contact us, if you are interested in them.

安裝

警告: 該補丁目前還處於實驗階段. 當該補丁用於調試java程式使用時,是相當穩定的。但不提倡在生產環境中使用該補丁。

1.下載安裝檔案 (下載地址)

2.執行安裝檔案

#windows
> java -jar dcevm-0.2-win.jar
#mac
$ sudo java -jar dcevm-0.2-mac.jar
#linux
$ sudo java -jar dcevm-0.2-linux.jar
選中路徑,執行install就完成了。如圖: 查看安裝程式源碼發現安裝過程就是將一些檔案拷貝到相應的位置:
32 位 windows 使用data/bin/目錄下檔案 替換掉java下 bin/client/jvm.dll 和 bin/server/jvm.dll ,並將以後的jvm.dll備份到相應目錄下。
將data/dcevm.jar 加到/jre/lib/ext/ 目錄
64位 windows 複製 data/64/bin/server/jvm.dll到 bin/server/jvm.dll
將data/dcevm.jar 加到/jre/lib/ext/ 目錄
32位 linux 如果jre/lib/i386/client/目錄存在:
       複製data/lib/i386/client/libjvm.so到 jre/lib/i386/client/libjvm.so
如果jre/lib/i386/server/目錄存在:
       複製data/lib/i386/server/libjvm.so到 jre/lib/i386/server/libjvm.so
將data/dcevm.jar 加到/jre/lib/ext/ 目錄
64位 linux(暫時不支援) 複製data/64/lib/amd64/server/libjvm.so到 jre/lib/amd64/server/libjvm.so ()
將data/dcevm.jar 加到/ jre/lib/ext/ 目錄

注意:

dcevm.jar要拷貝到 jre的目錄,如果指定java運行在jdk上,這個目錄就是jdk下的jre目錄.

linux的安裝檔案中並沒有data/64這個目錄,意味著64位linux不能正常安裝?杯具啊,有時間嘗試下看如何處理.

不能在linux下通過圖形介面安裝的童鞋可手動拷貝檔案.

 

調試java

兩種調試方式: debug模式啟動java程式 && eclipse remote debug eclipse中debug模式啟動程式

注意問題(更多問題補充中):

1.程式中動態添加的static 屬性 例如 private static String a = “x”,調用時會顯示a是null.

2.在一個正在執行的迴圈中,有些改變不能生效例如:

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();
}
}
原文地址:

http://www.cnblogs.com/redcreen/archive/2011/06/03/2071169.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.