欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JVM的類(lèi)加載過(guò)程詳細(xì)說(shuō)明

 更新時(shí)間:2021年06月01日 17:01:26   作者:god-jiang  
近來(lái)讀了《深入理解JVM虛擬機(jī)》的部分內(nèi)容,對(duì)JVM也慢慢有個(gè)整體的認(rèn)識(shí),今天就來(lái)分享一下我對(duì)JVM類(lèi)加載過(guò)程的學(xué)習(xí)和理解,需要的朋友可以參考下

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

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

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

在這里插入圖片描述

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

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

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

以以下ClassLoadDemo類(lèi)代碼舉例:

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

在這里插入圖片描述

三、驗(yàn)證

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

四、準(zhǔn)備

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

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

五、解析

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

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

六、核心階段:初始化

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

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

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

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

在這里插入圖片描述

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

類(lèi)加載器

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

啟動(dòng)類(lèi)加載器

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

擴(kuò)展類(lèi)加載器

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

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

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

自定義類(lèi)加載器

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

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

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

在這里插入圖片描述

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

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

八、總結(jié)

今天分享了類(lèi)加載過(guò)程還有類(lèi)加載器的相關(guān)知識(shí),主要以我的學(xué)習(xí)理解還有圖來(lái)更加直觀的理解這個(gè)知識(shí)點(diǎn)。

希望以上的內(nèi)容對(duì)你們有所幫助。

到此這篇關(guān)于JVM的類(lèi)加載過(guò)程詳細(xì)說(shuō)明的文章就介紹到這了,更多相關(guān)JVM類(lèi)加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Java8中Optional機(jī)制的正確姿勢(shì)

    使用Java8中Optional機(jī)制的正確姿勢(shì)

    我們知道 Java 8 增加了一些很有用的 API, 其中一個(gè)就是 Optional,下面這篇文章主要給大家介紹了關(guān)于如何正確使用Java8中Optional機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-11-11
  • Spring中的三級(jí)緩存與循環(huán)依賴(lài)詳解

    Spring中的三級(jí)緩存與循環(huán)依賴(lài)詳解

    Spring三級(jí)緩存是Spring框架中用于解決循環(huán)依賴(lài)問(wèn)題的一種機(jī)制,這篇文章主要介紹了Spring三級(jí)緩存與循環(huán)依賴(lài)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • java二維數(shù)組基礎(chǔ)知識(shí)詳解

    java二維數(shù)組基礎(chǔ)知識(shí)詳解

    這篇文章主要介紹了java二維數(shù)組基礎(chǔ)知識(shí)詳解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • IntelliJ IDEA 報(bào)錯(cuò):找不到包或者找不到符號(hào)的問(wèn)題及解決方案

    IntelliJ IDEA 報(bào)錯(cuò):找不到包或者找不到符號(hào)的問(wèn)題及解決方案

    這篇文章主要介紹了IntelliJ IDEA 報(bào)錯(cuò):找不到包或者找不到符號(hào)的問(wèn)題及解決方案,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 詳解JAVA的封裝

    詳解JAVA的封裝

    Java面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。下面對(duì)三大特性之一封裝進(jìn)行了總結(jié),需要的朋友可以參考下
    2017-04-04
  • Spring中bean的繼承與抽象代碼示例

    Spring中bean的繼承與抽象代碼示例

    這篇文章主要介紹了Spring中bean的繼承與抽象代碼示例,涉及abstract 屬性,bean實(shí)例化,子bean 與普通bean等相關(guān)內(nèi)容,代碼示例中注釋比較詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • SpringBoot單元測(cè)試框架Mockito介紹及使用

    SpringBoot單元測(cè)試框架Mockito介紹及使用

    與集成測(cè)試將系統(tǒng)作為一個(gè)整體測(cè)試不同,單元測(cè)試更應(yīng)該專(zhuān)注于某個(gè)類(lèi)。所以當(dāng)被測(cè)試類(lèi)與外部類(lèi)有依賴(lài)的時(shí)候,尤其是與數(shù)據(jù)庫(kù)相關(guān)的這種費(fèi)時(shí)且有狀態(tài)的類(lèi),很難做單元測(cè)試。但好在可以通過(guò)“Mockito”這種仿真框架來(lái)模擬這些比較費(fèi)時(shí)的類(lèi),從而專(zhuān)注于測(cè)試某個(gè)類(lèi)內(nèi)部的邏輯
    2023-01-01
  • Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案

    Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案

    這篇文章主要給大家介紹了關(guān)于Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案,這個(gè)異常是java.net包中的一部分,具體說(shuō)它是類(lèi)的一個(gè)實(shí)例,異常通常是由主機(jī)名無(wú)法解析為IP地址引起的,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • QR 二維碼中插入圖片實(shí)現(xiàn)方法

    QR 二維碼中插入圖片實(shí)現(xiàn)方法

    這篇文章主要介紹了QR 二維碼中插入圖片實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • 解決springboot集成rocketmq關(guān)于tag的坑

    解決springboot集成rocketmq關(guān)于tag的坑

    這篇文章主要介紹了解決springboot集成rocketmq關(guān)于tag的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論