資源描述:
《java虛擬機類加載機制-java開發(fā)java經(jīng)驗技巧》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、Java虛擬機類加載機制-編程開發(fā)技術(shù)Java虛擬機類加載機制原文出處:朱小廝看到這個題目,很多人會覺得我寫我的九腹代碼,至于類,JVM愛怎么加載就怎么加載,博主有很長一段時間也是這么認為的。隨著編程經(jīng)驗的日積月累,越來越感覺到了解虛擬機相關(guān)要領(lǐng)的重要性。閑話不多說,老規(guī)矩,先來一段代碼吊吊胃口。publicclassSSClass{static{System.out.printin("SSClass");}}publicclassSuperclasscxtcndsSSClass{static{System,out.printin("SuperClassinit!〃);}pub
2、licstaticintvalue二123;publicSuperClass(){System,out.println(z/initSuperclass'7);}}publicclassSubClassextendsSuperClass{static{System,out.printin("Subclassinit");}staticinta;publicSubClass()System,out.println(,zinitSubClassz,);publicclassNotlnitialization{publicstaticvoidmain(String[]args){Sy
3、stem,out.printin(SubClass,value);}}運行結(jié)果:SSClassSuperClassinit!123答案答對了囉?也許有人會疑問:為什么沒有輸出SubClassinitook~解釋一下:對于靜態(tài)字段,只有直接定義這個字段的類才會被初始化,因此通過其了類來引用父類中定義的靜態(tài)字段,只會觸發(fā)父類的初始化而不會觸發(fā)子類的初始化。上面就牽涉到了虛擬機類加載機制。如果有興趣,可以繼續(xù)看下去。類加載過程類從被加載到虛擬機內(nèi)存屮開始,到卸載出內(nèi)存為止,它的整個生命周期包括:加載(Loading)>驗證(Verification)>準備(Preparation)、
4、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)?個階段。其中準備、驗證、解析3個部分統(tǒng)稱為連接(Linking)。如圖所示。加載(Loading)驗證(Verification)準備(Preparation)解析(Resolution)連接(Unking)卸載使用初始化(Unloading)V丿(Using)(Initialization)<丿丿加載、驗證、準備、初始化和卸載這5個階段的順序是確定的,類的加載過程必須按照這利幀序按部就班地開始,而解析階段則不一定:它在某些情況下可以在初始化階段Z后再開始,這是
5、為了支持Java語言的運行時綁定(也稱為動態(tài)綁定或晚期綁定)。以下陳述的內(nèi)容都□HotSpot為基準。加載在加載階段(口J以參考java.lang.ClassLoader的loadClassO方法),虛擬機需要完成以下3件事情:1.通過一個類的全限定名來獲取定義此類的二進制字節(jié)流(并沒有指明要從一個Class文件中獲取,可以從其他渠道,譬如:網(wǎng)絡、動態(tài)生成、數(shù)據(jù)庫等);2.將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu);3.在內(nèi)存中牛成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口;加載階段和連接階段(Linking)的部
6、分內(nèi)容(如一部分字節(jié)碼文件格式驗證動作)是交叉進行的,加載階段尚未完成,連接階段可能已經(jīng)開始,但這些夾在加載階段之中進行的動作,仍然屬于連接階段的內(nèi)容,這兩個階段的開始吋間仍然保持著固定的先后順序。驗證驗證是連接階段的笫一步,這一階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。驗證階段大致會完成4個階段的檢驗動作:1.文件格式驗證:驗證字節(jié)流是否符合Class文件格式的規(guī)范;例如:是否以魔術(shù)OxCAFEBABE開頭、主次版本號是否在肖前虛擬機的處理范圍之內(nèi)、常量池中的常量是否有不被支持的類型。2.元數(shù)據(jù)驗證:對字節(jié)碼描述
7、的信息進行語義分析(注意:對比javac編譯階段的語義分析),以保證其描述的信息符合Java語言規(guī)范的要求;例如:這個類是否有父類,除Tjava.lang.Object之外。3.字節(jié)碼驗證:通過數(shù)據(jù)流和控制流分析,確定程序語義是合法的、符合邏輯的。4.符號引用驗證:確保解析動作能正確執(zhí)行。驗證階段是非常重要的,但不是必須的,它對程序運行期沒有影響,如果所引用的類經(jīng)過反復驗證,那么可以考慮采用-Xverifynone參數(shù)來關(guān)閉大部分的類驗證措施,以縮短虛擬機類加載的時間。準備準備階段是正式為類