JVM加載機(jī)制

JVM加載機(jī)制

ID:40748661

大小:40.26 KB

頁數(shù):4頁

時(shí)間:2019-08-07

JVM加載機(jī)制_第1頁
JVM加載機(jī)制_第2頁
JVM加載機(jī)制_第3頁
JVM加載機(jī)制_第4頁
資源描述:

《JVM加載機(jī)制》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、Java中,在調(diào)用類的靜態(tài)成員,或新建該類的對象等之前,類一定要先裝入Java虛擬機(jī)中,這是勿庸置疑的。但虛擬機(jī)怎樣把類裝載進(jìn)來的呢?要經(jīng)過三步:裝載(Load),鏈接(Link),初始化(Initializ)。其中鏈接又可分為校驗(yàn)(Verify),準(zhǔn)備(Prepare),解析(Resolve)三步。一、裝載(Load)ClassLoader就是用來裝載的。通過指定的className,找到二進(jìn)制碼,生成Class實(shí)例,放到JVM中。ClassLoader從頂向下分為?BootstrapClassLoader、ExtensionClassLoader、SystemCl

2、assLoader以及User-DefinedClassLoader(分叉,可以多個(gè))。如下圖。這是Tomcat裝載器的例子:裝載過程從源碼清析可見:protectedsynchronizedClassloadClass(Stringname,booleanresolve)????throwsClassNotFoundException{????//先檢查是否已被當(dāng)前ClassLoader裝載。????Classc=findLoadedClass(name);????if(c==null){????????try{????????if(parent!=null)

3、{????????????//如果沒被當(dāng)前裝載,則遞歸的到父中裝載。????????????c=parent.loadClass(name,false);????????}else{???????????//裝載器樹已到頂,還沒找到的話就到Bootstrap裝載器中找。注意:雖然Bootstrap是所有加載器的根,但它是C++實(shí)現(xiàn)的,不可能放到子的"parent"中,因此,第二層裝載器是所有的根了。????????????c=findBootstrapClass0(name);????????}????????}catch(ClassNotFoundException

4、e){????????????//如果祖先都無法裝載,則用當(dāng)前的裝載。子類可在findClass方法中調(diào)用defineClass,把從自定義位置獲得的字節(jié)碼轉(zhuǎn)換成Class。????????????c=findClass(name);????????}????}????if(resolve){????????//Linksthespecifiedclass.????????resolveClass(c);??//注????}????returnc;}注:1.resolveClass(c)方法的注釋是鏈接類,而不只是解析,從該即可看出。調(diào)用resolveClass時(shí)語義

5、上是去鏈接,是否真的鏈接了我不是很清楚,但可以肯定的是沒有初始化。當(dāng)A類中有staticBb=newB()時(shí),最晚會(huì)在初始化時(shí)去裝載B。如果改成staticBb=null,那么把B.class刪掉后,即使A已經(jīng)鏈接,初始化過了,但也不會(huì)報(bào)錯(cuò),也就是A所引用的B類沒有被加載過。解析時(shí)難道沒有真的去裝入它所引用的B類?還是鏈接時(shí),沒有執(zhí)行解析的步驟?問題的關(guān)鍵就是1.對“解析”的理解,解析時(shí)是否會(huì)去裝載B類?2.JVM在鏈接時(shí)是否執(zhí)行了解析?(畢竟有資料說,解析是可選步驟)二、鏈接鏈接就是把load進(jìn)來的class合并到JVM的運(yùn)行時(shí)狀態(tài)中。鏈接?是三個(gè)階段中最復(fù)雜的一個(gè)

6、??梢园阉殖扇齻€(gè)主要階段:·校驗(yàn)。?對二進(jìn)制字節(jié)碼的格式進(jìn)行校驗(yàn),以確保格式正確、行為正確?!?zhǔn)備。?準(zhǔn)備類中定義的字段、方法和實(shí)現(xiàn)接口所必需的數(shù)據(jù)結(jié)構(gòu)。比如會(huì)為類中的靜態(tài)變量賦默認(rèn)值(int等:0,reference:null,char:'u0000')?!そ馕觥?裝入類所引用的其他所有類??梢杂迷S多方式引用類:·超類·接口·字段·方法簽名·方法中使用的本地變量三、初始化Initializationofaclassconsistsofexecutingitsstaticinitializersandtheinitializersforstatic?fields(

7、classvariables)declaredintheclass.Initializationofaninterfaceconsistsofexecutingtheinitializersforfields(constants)declaredthere.類的初始化包括:執(zhí)行靜態(tài)區(qū)塊和靜態(tài)方法的初始化。比如下面這兩種代碼都會(huì)被執(zhí)行,包括newB()。static{??...}staticBb=newB();接口中不允許有staticinitializer(也就是static{...}),所以對于接口,只會(huì)執(zhí)行靜態(tài)字段的初始化。初始化前,裝載,鏈接一

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

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

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