溫馨提示×

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

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

JVM的類加載過程有哪些

發(fā)布時(shí)間:2021-06-02 16:34:05 來源:億速云 閱讀:165 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章給大家介紹JVM的類加載過程有哪些,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

一、基礎(chǔ)知識(shí)

我們平時(shí)寫的Java寫代碼一般都是.java文件,編譯成為.class字節(jié)碼文件,然后類加載器把.class文件加載到JVM內(nèi)存中,接下來JVM就執(zhí)行我們的字節(jié)碼文件,整個(gè)過程就是這樣。

畫個(gè)圖方便大家好理解:

JVM的類加載過程有哪些

類加載過程其實(shí)非?,嵥榍覐?fù)雜,但是我們只要把握其中的核心工作原理即可

一個(gè)類從加載到使用會(huì)經(jīng)歷以下步驟:

加載-〉驗(yàn)證-〉準(zhǔn)備-〉解析-〉初始化-〉使用-〉卸載

以以下ClassLoadDemo類代碼舉例:

/**
 * @author god-jiang
 * @date 2021/5/29
 */
public class ClassLoadDemo {

    private static int count = 666;

    public static void main(String[] args) {
        ReplicaManager replicaManager = new ReplicaManager();
    }
}

二、加載

那么什么時(shí)候會(huì)加載一個(gè)類呢?答案很簡(jiǎn)單,當(dāng)你使用到這個(gè)類的時(shí)候JVM就會(huì)去加載。示例代碼main函數(shù)是入口,會(huì)加載ClassLoadDemo.class字節(jié)碼,又因?yàn)閙ain函數(shù)使用了ReplicaManager.class,所以繼續(xù)加載。

JVM的類加載過程有哪些

三、驗(yàn)證

驗(yàn)證這一步,是根據(jù)JVM規(guī)范,來校驗(yàn)?zāi)慵虞d進(jìn)來的.class文件的內(nèi)容是否符合規(guī)范。當(dāng)你的.class文件被人惡意修改了,字節(jié)碼不符合JVM規(guī)范,那么JVM是沒法執(zhí)行這個(gè)字節(jié)碼的。所以.class被加載到內(nèi)存中需要驗(yàn)證,通過了之后才能交給JVM來運(yùn)行

四、準(zhǔn)備

準(zhǔn)備這一步,就是給你的class中的類分配一定的內(nèi)存空間,比如ClassLoadDemo類,就會(huì)給它分配內(nèi)存空間,然后給它里面的static變量分配內(nèi)存空間,給一個(gè)默認(rèn)的初始值。

PS:int的默認(rèn)值為0,boolean的默認(rèn)值是false,引用類型的默認(rèn)值為null,以此類推。

五、解析

解析這一步,實(shí)際上就是把符號(hào)引用替換為直接引用的過程。這一部分涉及JVM底層,有點(diǎn)復(fù)雜,所以不再深究。

以上三步,就核心就是“準(zhǔn)備階段”。因?yàn)檫@個(gè)階段是給加載進(jìn)來的類分配好了內(nèi)存空間,類變量也分配了內(nèi)存空間,并且給了默認(rèn)的初始值,這個(gè)概念,大家心里一定要有。

六、核心階段:初始化

上面講過準(zhǔn)備階段會(huì)給類變量分配一個(gè)內(nèi)存空間,然后給初始值。但是賦值這一段邏輯在哪里執(zhí)行呢?答案就是在初始化階段。

以上的示例代碼ClassLoadDemo.class的count變量在準(zhǔn)備階段就是給一個(gè)默認(rèn)值0,但是到了初始化就會(huì)賦值為666。

知道了類的加載過程,那么什么時(shí)候初始化一個(gè)類呢?這里有一個(gè)非常重要的規(guī)則,就是如果初始化一個(gè)類,發(fā)現(xiàn)他的父類還沒初始化,那么必須先初始化他的父類。

到這里大家應(yīng)該對(duì)類加載的整個(gè)過程都有一定的了解,我再根據(jù)以上內(nèi)容畫一個(gè)張圖方便理解。

JVM的類加載過程有哪些

現(xiàn)在相信大家已經(jīng)搞明白了整個(gè)類加載從觸發(fā)時(shí)機(jī)到初始化的過程了,那么還有一個(gè)重要的知識(shí)點(diǎn)是類加載器,接著分享。

類加載器

JVM的類加載器主要有四種,Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader,還有一個(gè)是自定義類加載器。接下來我來介紹一下他們。

啟動(dòng)類加載器

Bootstrap ClassLoader主要負(fù)責(zé)加載我們?cè)陔娔X上安裝的Java目錄下的核心類。比如我們安裝的JDK下就有一個(gè)lib目錄,里面放著Java最核心的類,支持著Java系統(tǒng)的運(yùn)行。

擴(kuò)展類加載器

Extension ClassLoader也是類似的,在我們安裝的JDK中有一個(gè)lib/ext目錄,這里面有一些類就是需要使用這個(gè)類加載器加載,支持你的Java系統(tǒng)運(yùn)行。

應(yīng)用程序類加載器

Application ClassLoader負(fù)責(zé)去加載ClassPath環(huán)境變量所指定的類,其實(shí)可以大概理解為加載你寫好的Java代碼,然后這個(gè)類加載器幫我們把寫好的代碼加載到內(nèi)存中運(yùn)行。

自定義類加載器

除了以上的三種類加載器,我們還可以自定義類加載器,根據(jù)自己的需求加載類。

七、雙親委派機(jī)制

JVM的類加載器是有親子層級(jí)結(jié)構(gòu),啟動(dòng)類加載器是處于最上層的,擴(kuò)展類加載器在第二層,第三層是應(yīng)用程序類加載器,最后一層是自定義加載器。

JVM的類加載過程有哪些

雙親委派機(jī)制說的是,假設(shè)你的應(yīng)用程序需要加載一個(gè)類,它會(huì)首先委派給自己的父類加載器去加載,最后到Bootstrap ClassLoader加載器。

如果最上層的類加載器加載不了,他就會(huì)下推權(quán)利給下面的類加載去加載,一層層下來。

關(guān)于JVM的類加載過程有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向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