深入探索java熱部署-java開發(fā)java經(jīng)驗技巧

深入探索java熱部署-java開發(fā)java經(jīng)驗技巧

ID:30884249

大?。?4.19 KB

頁數(shù):8頁

時間:2019-01-03

深入探索java熱部署-java開發(fā)java經(jīng)驗技巧_第1頁
深入探索java熱部署-java開發(fā)java經(jīng)驗技巧_第2頁
深入探索java熱部署-java開發(fā)java經(jīng)驗技巧_第3頁
深入探索java熱部署-java開發(fā)java經(jīng)驗技巧_第4頁
深入探索java熱部署-java開發(fā)java經(jīng)驗技巧_第5頁
資源描述:

《深入探索java熱部署-java開發(fā)java經(jīng)驗技巧》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫

1、深入探索Java熱部署-Java開發(fā)Java經(jīng)驗技巧深入探索Java熱部署原文出處:IBM/丁志君簡介在Java開發(fā)領域,熱部署一直是一個難以解決的問題,目前的Java虛擬機只能實現(xiàn)方法體的修改熱部署,對于整個類的結構修改,仍然需要重啟虛擬機,對類重新加載才能完成更新操作。對于某些人型的應用來說,每次的重啟都需?;ㄙM大量的時間成本。雖然osgi架構的出現(xiàn),讓模塊重啟成為可能,但是如果模塊Z間有調(diào)用關系的話,這樣的操作依然會讓應用岀現(xiàn)短暫的功能性休克。本文將探索如何在不破壞Java虛擬機現(xiàn)有行為的前提下,實現(xiàn)某個單一類的熱部署,讓系統(tǒng)無需重啟就完成某個類的

2、更新。類加載的探索首先談一卜?何為熱部署(hotswap),熱部署是在不重啟Java虛擬機的而提卜,能自動偵測到class文件的變化,更新運行時class的行為。Java類是通過Java虛擬機加載的,某個類的class文件在被classloader加載后,會生成對應的Class對象,之后就可以創(chuàng)建該類的實例。默認的虛擬機行為只會在啟動時加載類,如果后期有一個類需要更新的話,單純替換編譯的class文件,Java虛擬機是不會更新止在運行的classo如果要實現(xiàn)熱部署,最根本的方式是修改虛擬機的源代碼,改變classloader的加載行為,使虛擬機能監(jiān)聽cl

3、ass文件的更新,重新加載class文件,這樣的行為破壞性很大,為后續(xù)的JVM升級埋下了一個大坑。另一種友好的方法是創(chuàng)建自lA的classloader來加載需要監(jiān)聽的class,這樣就能控制類加載的時機,從而實現(xiàn)熱部署。本文將具體探索如何實現(xiàn)這個方案。首先需要了解一下Java虛擬機現(xiàn)有的加載機制。目前的加載機制,稱為雙親委派,系統(tǒng)在使用一個classloader來加載類時,會先詢問當前classloader的父類是否有能力加載,如果父類無法實現(xiàn)加載操作,才會將任務下放到該classloader來加載。這種自上而下的加載方式的好處是,讓每個classloa

4、der執(zhí)行自己的加載任務,不會重復加載類。但是這種方式卻使加載順序非常難改變,讓自定義classloader搶先加載需要監(jiān)聽改變的類成為了一個難題。不過我們可以換一個思路,雖然無法搶先加載該類,但是仍然可以用自定義classloader創(chuàng)建一個功能相同的類,讓每次實例化的對象都指向這個新的類。當這個類的class文件發(fā)生改變的時候,再次創(chuàng)建一個更新的類,之后如果系統(tǒng)再次發(fā)出實例化請求,創(chuàng)建的對象講指向這個全新的類。卜?而來簡單列舉一下需要做的工作。?創(chuàng)建自定義的classloader,加載需要監(jiān)聽改變的類,在class文件發(fā)生改變的時候,重新加載該類。?

5、改變創(chuàng)建對彖的行為,使他們在創(chuàng)建時使用口定義classloader加載的classo自定義加載器的實現(xiàn)自定義加載器仍然需要執(zhí)行類加載的功能。這里卻存在一個問題,同一個類加載器無法同時加載兩個相同名稱的類,由于不論類的結構如何發(fā)主變化,生成的類名不會變,而classloader只能在虛擬機停止前銷毀已經(jīng)加載的類,這樣classloader就無法加載更新后的類了。這里有一個小技巧,讓每次加載的類都保存成一個帶有版本信息的class,比如加載Test,class時,保存在內(nèi)存中的類是Test_vl.class,當類發(fā)生改變時,重新加載的類名是Test_v2.c

6、lasso但是真正執(zhí)彳亍加載class文件創(chuàng)建class的defineClass方法是一個native的方法,修改起來又變得很閑難。所以面前還剩一條路,那就是直接修改編譯生成的class文件。利用ASM修改class文件可以修改字節(jié)碼的框架有很多,比如ASM,CGLIBo本文使用的是ASMo先來介紹一下class文件的結構,class文件包含了以下幾類信息,一個是類的基木信息,包含了訪問權限信息,類名信息,父類信息,接口信息。第二個是類的變量信息。第三個是方法的信息。ASM會先加載一個class文件,然后嚴格順序讀取類的各項信息,用戶可以按照自己的意愿定

7、義增強組件修改這些信息,最后輸出成一個新的classo首先看一下如何利用ASM修改類信息。清單1.利用ASM修改字節(jié)碼ClassWritcrcw=newClassWriter(ClassWriter.COMPUTE_MAXS);ClassReadercr=null;StringenhancedClassName二classSource.getEnhancedName();try{cr=newClassReader(newFilclnputStrcam(classSource?getFile()));}catch(IOExceptione

8、){e.printStackTrace();returnnul1;ClassVi

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。