溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

jvm中類加載過程的示例分析

發(fā)布時(shí)間:2021-07-27 13:00:27 來源:億速云 閱讀:153 作者:小新 欄目:編程語言

這篇文章主要介紹jvm中類加載過程的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

類加載過程:1、加載階段;2、驗(yàn)證階段;3、準(zhǔn)備階段,主要是將類變量在方法區(qū)進(jìn)行內(nèi)存分配并進(jìn)行初始化;4、解析階段;5、初始化階段,編譯器會(huì)將類文件聲明的靜態(tài)賦值變量和靜態(tài)區(qū)域合并生成cinit方法并進(jìn)行調(diào)用;6、使用階段;7、卸載階段。

本教程操作環(huán)境:windows7系統(tǒng)、java8版、DELL G3電腦。

理解JVM的類加載過程,主要要回答兩個(gè)問題:

1、類在什么時(shí)候被加載。

2、類是怎樣被加載的。

jvm中類加載過程的示例分析

一、觸發(fā)類加載的條件:

類的加載過程主要分為七個(gè)階段:加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用、卸載;加載、驗(yàn)證、準(zhǔn)備、初始化、卸載這五個(gè)過程順序是確定的,jvm必須嚴(yán)格按照這個(gè)順序執(zhí)行,jvm沒有規(guī)定類加載的時(shí)機(jī),但卻嚴(yán)格規(guī)定了五種情況下必須立即對(duì)類進(jìn)行初始化,加載自然要在此之前。

1、遇到new、getstatic、putstatic、invokestatic這四條指令時(shí),如果類沒有被初始化,則首先對(duì)類進(jìn)行初始化。

2、使用java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用時(shí),若類沒有進(jìn)行初始化,則觸發(fā)其初始化。

3、當(dāng)初始化一個(gè)類時(shí)假如該類的父類沒有進(jìn)行初始化,首先觸發(fā)其父類的初始化。

4、運(yùn)行JVM必須指定一個(gè)含有main方法的主類,虛擬機(jī)會(huì)先初始化這個(gè)類。

5、當(dāng)使用Jdk1.7的動(dòng)態(tài)語言支持時(shí),如果一個(gè)java.lang.invoke.MethodHandle實(shí)例最后的解析結(jié)果REF_getstatic、REF_putstatic、REF_inokestatic的方法句柄,并且這個(gè)方法句柄所對(duì)應(yīng)的類沒有進(jìn)行初始化時(shí),觸發(fā)該類初始化。

二、類加載過程

類加載過程主要分為七個(gè)階段:加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用、卸載。

1、加載:

1)、通過一個(gè)類的全限定名加載該類對(duì)應(yīng)的二進(jìn)制字節(jié)流。主要通過類加載器實(shí)現(xiàn)。

2)、將字節(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è)類訪問該類的入口。(Hotspot 在方法區(qū)生成該類)。

2、驗(yàn)證:

1)、文件格式驗(yàn)證:驗(yàn)證類文件的魔術(shù)版本號(hào)常量等是否符合當(dāng)前虛擬機(jī)支持的范圍。

2)、元數(shù)據(jù)驗(yàn)證:驗(yàn)證類的語義信息,是否符合java語言規(guī)范的要求。

3)、字節(jié)碼驗(yàn)證:驗(yàn)證程序語義是合法的、合乎規(guī)范的。主要通過stackmapframe結(jié)構(gòu)。

4)、符號(hào)引用驗(yàn)證:虛擬機(jī)在將符號(hào)引用轉(zhuǎn)化為直接引用,驗(yàn)證符號(hào)引用全限定名代表的類是否能夠找到,對(duì)應(yīng)的域和方法是否能找到,訪問權(quán)限是否合法。

3、準(zhǔn)備:

準(zhǔn)備階段主要是將類變量(被static修飾符修飾)在方法區(qū)進(jìn)行內(nèi)存分配并進(jìn)行初始化。

數(shù)據(jù)類型零值數(shù)據(jù)類型零值
int0booleanfalse
long0Lfloat0.0f
short0double0.0d
char'\u0000'referencenull
byte0

4、解析:

1)、類或接口解析:將符合引用轉(zhuǎn)化為類的直接引用,并檢查訪問權(quán)限。

2)、字段解析:將字段的符號(hào)引用轉(zhuǎn)化為字段所屬的類信息或其父類該字段的直接引用,并檢查訪問權(quán)限。

3)、類方法解析:將類方法的符號(hào)引用轉(zhuǎn)化為類方法所屬的類信息或其父類該字段的直接引用,并檢查訪問權(quán)限。

4)、接口方法解析:將接口方法的符號(hào)引用轉(zhuǎn)化為接口方法所屬的接口信息或其父類該字段的直接引用,并檢查訪問權(quán)限。

5、初始化:

初始化階段編譯器會(huì)將類文件聲明的靜態(tài)賦值變量和靜態(tài)區(qū)域合并生成<cinit>方法并進(jìn)行調(diào)用。

類加載器:類加載器是“通過一個(gè)類的全限定名加載這個(gè)類的二進(jìn)制字節(jié)流”的實(shí)現(xiàn),對(duì)于任何一個(gè)類,都是由類加載器和該類的本身共同確定在虛擬機(jī)中的唯一性。

雙親委派模型:

jvm中類加載過程的示例分析

1、Bootstrap ClassLoader 啟動(dòng)類加載器,負(fù)責(zé)加載<JAVA_HOME>/lib/rt.jar.

2、Extension ClassLoader 拓展類加載器,負(fù)責(zé)加載<JAVA_HOME>/lib/ext底下的包

3、Application  ClassLoader 應(yīng)用類加載器,負(fù)責(zé)加載CLASSPATH路徑下的JAVA類庫。

4、User ClassLoader 用戶自定義的類加載器。

雙親委托模型采用這樣的方式加載類:當(dāng)類加載器收到加載類請(qǐng)求時(shí),首先委托父類加載該類,所有類加載器都采用這種方式,因此所有類加載請(qǐng)求都會(huì)到達(dá)頂層父類,父類加載不到時(shí)再使用該類加載器中加載。這樣,類加載器之間就有了一種層級(jí)關(guān)系,能夠保證Java的基礎(chǔ)類由相同的類加載器加載,對(duì)Java系統(tǒng)的穩(wěn)定性起到至關(guān)重要的作用。

以上是“jvm中類加載過程的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI