最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM的類加載過程詳細說明

 更新時間:2021年06月01日 17:01:26   作者:god-jiang  
近來讀了《深入理解JVM虛擬機》的部分內容,對JVM也慢慢有個整體的認識,今天就來分享一下我對JVM類加載過程的學習和理解,需要的朋友可以參考下

一、基礎知識

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

畫個圖方便大家好理解:

在這里插入圖片描述

類加載過程其實非常瑣碎且復雜,但是我們只要把握其中的核心工作原理即可

一個類從加載到使用會經歷以下步驟:

加載-〉驗證-〉準備-〉解析-〉初始化-〉使用-〉卸載

以以下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();
    }
}

二、加載

那么什么時候會加載一個類呢?答案很簡單,當你使用到這個類的時候JVM就會去加載。示例代碼main函數是入口,會加載ClassLoadDemo.class字節(jié)碼,又因為main函數使用了ReplicaManager.class,所以繼續(xù)加載。

在這里插入圖片描述

三、驗證

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

四、準備

準備這一步,就是給你的class中的類分配一定的內存空間,比如ClassLoadDemo類,就會給它分配內存空間,然后給它里面的static變量分配內存空間,給一個默認的初始值。

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

五、解析

解析這一步,實際上就是把符號引用替換為直接引用的過程。這一部分涉及JVM底層,有點復雜,所以不再深究。

以上三步,就核心就是“準備階段”。因為這個階段是給加載進來的類分配好了內存空間,類變量也分配了內存空間,并且給了默認的初始值,這個概念,大家心里一定要有。

六、核心階段:初始化

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

以上的示例代碼ClassLoadDemo.class的count變量在準備階段就是給一個默認值0,但是到了初始化就會賦值為666。

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

到這里大家應該對類加載的整個過程都有一定的了解,我再根據以上內容畫一個張圖方便理解。

在這里插入圖片描述

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

類加載器

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

啟動類加載器

Bootstrap ClassLoader主要負責加載我們在電腦上安裝的Java目錄下的核心類。比如我們安裝的JDK下就有一個lib目錄,里面放著Java最核心的類,支持著Java系統的運行。

擴展類加載器

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

應用程序類加載器

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

自定義類加載器

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

七、雙親委派機制

JVM的類加載器是有親子層級結構,啟動類加載器是處于最上層的,擴展類加載器在第二層,第三層是應用程序類加載器,最后一層是自定義加載器。

在這里插入圖片描述

雙親委派機制說的是,假設你的應用程序需要加載一個類,它會首先委派給自己的父類加載器去加載,最后到Bootstrap ClassLoader加載器。

如果最上層的類加載器加載不了,他就會下推權利給下面的類加載去加載,一層層下來。

八、總結

今天分享了類加載過程還有類加載器的相關知識,主要以我的學習理解還有圖來更加直觀的理解這個知識點。

希望以上的內容對你們有所幫助。

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

相關文章

  • 解決java壓縮圖片透明背景變黑色的問題

    解決java壓縮圖片透明背景變黑色的問題

    這篇文章主要介紹了解決java壓縮圖片透明背景變黑色的問題,需要的朋友可以參考下
    2014-04-04
  • 解析Java的Hibernate框架中的持久化類和映射文件

    解析Java的Hibernate框架中的持久化類和映射文件

    這篇文章主要介紹了Java的Hibernate框架中的持久化類和映射文件,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • springBoot整合rabbitmq測試常用模型小結

    springBoot整合rabbitmq測試常用模型小結

    這篇文章主要介紹了springBoot整合rabbitmq并測試五種常用模型,本文主要針對前五種常用模型,在spirngboot框架的基礎上整合rabbitmq并進行測試使用,需要的朋友可以參考下
    2022-01-01
  • 在SpringBoot環(huán)境中使用Mockito進行單元測試的示例詳解

    在SpringBoot環(huán)境中使用Mockito進行單元測試的示例詳解

    Mockito特別適用于在Spring Boot環(huán)境中進行單元測試,因為它能夠輕松模擬Spring應用中的服務、存儲庫、客戶端和其他組件,通過使用Mockito,開發(fā)者可以模擬外部依賴,從而使單元測試更加獨立和可靠,本文給大家介紹了在Spring Boot環(huán)境中使用Mockito進行單元測試
    2024-01-01
  • MyBatis框架實現一個簡單的數據查詢操作

    MyBatis框架實現一個簡單的數據查詢操作

    本文介紹了MyBatis框架下進行數據查詢操作的詳細步驟,括創(chuàng)建實體類、編寫SQL標簽、配置Mapper、開啟駝峰命名映射以及執(zhí)行SQL語句等,感興趣的可以了解一下
    2024-12-12
  • idea的使用之關于tomcat熱部署的教程

    idea的使用之關于tomcat熱部署的教程

    這篇文章主要介紹了idea的使用之關于tomcat熱部署的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java Web監(jiān)聽器如何實現定時發(fā)送郵件

    Java Web監(jiān)聽器如何實現定時發(fā)送郵件

    這篇文章主要介紹了Java Web監(jiān)聽器如何實現定時發(fā)送郵件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • 從SpringBoot打war包并配置外部Tomcat運行的全流程

    從SpringBoot打war包并配置外部Tomcat運行的全流程

    由于其他原因,我們需要使用SpringBoot打成war包放在外部的Tomcat中運行,本文就以一個案例來說明從SpringBoot打war包到Tomcat配置并運行的全流程經過,需要的朋友可以參考下
    2024-06-06
  • 如何用Java實現排列組合算法

    如何用Java實現排列組合算法

    本文主要介紹了如何用Java實現排列組合算法,對算法感興趣的同學,可以參考一下,理解其原理,并且試驗一下。
    2021-05-05
  • SpringBoot MongoDB詳細使用教程

    SpringBoot MongoDB詳細使用教程

    這篇文章主要介紹了SpringBoot整合Mongodb實現簡單的增刪查改,MongoDB是一個以分布式數據庫為核心的數據庫,因此高可用性、橫向擴展和地理分布是內置的,并且易于使用。況且,MongoDB是免費的,開源的,感興趣的朋友跟隨小編一起看看吧
    2022-10-10

最新評論

双桥区| 长春市| 乐至县| 建瓯市| 孟连| 荆州市| 沈阳市| 大名县| 临猗县| 万安县| 阳新县| 洪江市| 桂林市| 乐山市| 青田县| 洛宁县| 剑河县| 射洪县| 阿坝县| 尉氏县| 都昌县| 周宁县| 铁岭县| 友谊县| 库尔勒市| 临汾市| 高雄县| 福贡县| 临高县| 红安县| 丰县| 格尔木市| 绥江县| 嘉鱼县| 轮台县| 赤水市| 全椒县| 扶风县| 辛集市| 揭东县| 方正县|