虛擬機(jī)類加載機(jī)制

? ? ? ?虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換、解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制。

1. 類的加載時(shí)機(jī)

上圖中,加載,驗(yàn)證,準(zhǔn)備,初始化和卸載這五個(gè)階段的順序是確定的,而解析階段則不一定,可以在初始化之前,也可以在初始化之后,這是為了支持運(yùn)行時(shí)綁定。

接口與類初始化過程的不同點(diǎn):當(dāng)一個(gè)類在初始化時(shí),要求其父類 全部都已經(jīng)初始化,但一個(gè)接口并不要求其父接口全部都初始化,只有在真正使用到父接口的時(shí)候才會(huì)初始化。

2. 類加載的過程

1. 加載:在加載過程中虛擬機(jī)需要完成以下三件事:

? ? 1)通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流;

? ? 2)將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)換為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu);

? ?3)在內(nèi)存中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問入口;

2. 驗(yàn)證:連接階段的第一步,為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全。包括以下驗(yàn)證:

? ? 1)文件格式的驗(yàn)證:魔數(shù)版本號(hào)之類的

? ? 2)元數(shù)據(jù)的驗(yàn)證:驗(yàn)證類與父類之間的關(guān)系,對(duì)類的元數(shù)據(jù)進(jìn)行語義校驗(yàn)

? ? 3)字節(jié)碼驗(yàn)證:最復(fù)雜的階段,通過數(shù)據(jù)流和控制流分析,確定程序語義是合法的,符合邏輯的,對(duì)類的方法體進(jìn)行校驗(yàn)分析。

? ? 4)符號(hào)引用驗(yàn)證:對(duì)類自身以外(常量池中的各種符號(hào)引用)的信息進(jìn)行匹配性校驗(yàn),主要發(fā)生在虛擬機(jī)將符號(hào)引用轉(zhuǎn)化為直接引用的時(shí)候。

3. 準(zhǔn)備:正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段,都將在方法區(qū)進(jìn)行分配,只包括類變量,不包括實(shí)例變量,而這里說的初始值通常情況下,是數(shù)據(jù)類型的零值。如果類字段的字段屬性表中存在ConstantValue屬性(即是final的),就被會(huì)初始化為指定的值。

4. 解析:解析階段是虛擬機(jī)將虛擬機(jī)常量池的符號(hào)引用替換為直接引用的過程。包括以下幾種情況:

? ? 1)類或接口的解析

? ? 2)字段解析

? ? 3)類方法解析

? ? 4)接口方法解析

5. 初始化:此階段才真正開始執(zhí)行類中定義的Java程序代碼(或者說是字節(jié)碼)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容