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

Java虛擬機(jī)JVM類加載機(jī)制(從類文件到虛擬機(jī))

 更新時(shí)間:2021年06月04日 09:54:59   作者:smileNicky  
所謂的類加載機(jī)制就是虛擬機(jī)將class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行驗(yàn)證,轉(zhuǎn)換解析和初始化,形成虛擬機(jī)可以直接使用的java類型,本文給大家介紹類加載機(jī)制過程從類文件到虛擬機(jī)的詳細(xì)說明,感興趣的朋友跟隨小編一起看看吧

一、類加載機(jī)制簡介

什么是類的加載

類的加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi),然后在堆區(qū)創(chuàng)建一個(gè)java.lang.Class對象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。類的加載的最終產(chǎn)品是位于堆區(qū)中的Class對象,Class對象封裝了類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu),并且向Java程序員提供了訪問方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口。

類加載機(jī)制:所謂的類加載機(jī)制就是虛擬機(jī)將class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行驗(yàn)證,轉(zhuǎn)換解析和初始化,形成虛擬機(jī)可以直接使用的java類型(即java.lang.class)

JVM的類加載機(jī)制分為五個(gè)部分:加載,驗(yàn)證,準(zhǔn)備,解析,初始化,圖示:

在這里插入圖片描述

二、類加載機(jī)制過程

 2.1、加載(Load)

所謂JVM加載過程,是查找和導(dǎo)入class文件,加載過程:

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

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

在這里插入圖片描述

(3)在JVM堆中生成代表這個(gè)類的java.lang.class對象(作為方法區(qū)中這些數(shù)據(jù)的訪問入口)

在這里插入圖片描述

2.2、連接(Linking)

2.2.1、驗(yàn)證(Verify)

JVM驗(yàn)證(Verify)這個(gè)過程是為了保證被加載類的正確性,保證其它后續(xù)步驟的正確正常執(zhí)行,驗(yàn)證的過程包括:

  • 文件格式驗(yàn)證
  • 元數(shù)據(jù)驗(yàn)證
  • 字節(jié)碼驗(yàn)證
  • 符號引用驗(yàn)證

2.2.2、準(zhǔn)備(Prepare)

準(zhǔn)備(Prepare)階段,是為類變量分配內(nèi)存并設(shè)置初始化值的。

eg:

public static int v = 9092;

注意:在類加載的準(zhǔn)備(Prepare)階段,v變量是賦值為0的而不是9092,這個(gè)值是在后續(xù)過程才賦值的

 private static int i;
public static void main(String[] args) {
    // 正常打印出0,靜態(tài)變量在類加載的準(zhǔn)備階段會賦值0
    System.out.println(i);
}
public static void main(String[] args) {
   // 編譯報(bào)錯(cuò),因?yàn)榫植孔兞繘]賦值不會自動生成初始化值
    int i;
    System.out.println(i);
}

2.2.3、解析(Resolve)

這個(gè)階段是將常量池中的符號引用轉(zhuǎn)換為直接引用的過程。所謂符號引用就是class文件中的:

1.  CONSTANT_Class_info
2.  CONSTANT_Field_info
3.  CONSTANT_Method_info
// 等等
...

直接引用可以是指向目標(biāo)的指針,相對偏移量或是一個(gè)能間接定位到目標(biāo)的句柄。

直接引用和字符引用一個(gè)最明顯的區(qū)別是,直接引用是目標(biāo)是已經(jīng)被加載到內(nèi)存的,而字符引用并不一定已經(jīng)加載到內(nèi)存。

2.3、初始化(Initialize)

類加載的初始化階段,是對類的變量和代碼塊執(zhí)行初始化操作,是執(zhí)行類構(gòu)造器的過程,換句話說是對類的靜態(tài)變量,靜態(tài)代碼塊執(zhí)行初始化操作

三、類加載器Classloader

 3.1、類加載器簡介

類的加載過程是在JVM之外的,目的是為了讓應(yīng)用程序決定如何獲取需要的類。

類加載,也即類加載器通過類的全限定名獲取其定義的二進(jìn)制字節(jié)流,顧名思義,類加載器就是來加載class文件的。

3.2、類加載器分類

類加載器可以分為啟動類加載器,拓展類加載器,應(yīng)用程序類加載器

在這里插入圖片描述

  • 1)、 Bootstrap classload(啟動類加載器):負(fù)責(zé)加載$JAVA_HOMEjre/lib/rt.jar里所有的class或者--Xbootclasspath系統(tǒng)參數(shù)指定路徑下的jar包。這個(gè)實(shí)現(xiàn)是由c++實(shí)現(xiàn)的
  • 2)、Extension Classload(拓展類加載器):負(fù)責(zé)加載java平臺中拓展的一些jar,包括$JAVA_HOMEjre/lib/ext/*.jar或者-Djava.ext.dirs指定目錄下的jar包
  • 3)、Application Classload(應(yīng)用程序類加載器):負(fù)責(zé)加載classpath中指定的jar或者Djava.class.path指定路徑的類和jar包
  • 4)、custom classload(自定義的類加載器):通過java.lang.ClassLoader的子類實(shí)現(xiàn)的類,屬于程序根據(jù)需要自定義拓展的類加載器,如tomcat、jboss都會根據(jù)j2ee規(guī)范自行實(shí)現(xiàn)ClassLoader

3.3、雙親委派

類的加載原則:按照“雙親委派”的原則加載的,當(dāng)一個(gè)類收到了類加載請求,他首先不會嘗試自己去加載這個(gè)類,而是把這個(gè)請求委派給父類去完成,每一個(gè)層次類加載器都是如此也即class類的加載,按照自頂向下的規(guī)則,由Bootstrap Classload到custom classload,就是由上層的加載類來加載類

目的:不管是哪個(gè)加載器加載這個(gè)類,最終都是委托給頂層的啟動類加載器進(jìn)行加載,保證了使用不同的類加載器最終得到的都是同樣一個(gè) Object 對象。

附錄:參數(shù)資料

https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

以上就是Java JVM類加載機(jī)制(從類文件到虛擬機(jī))的詳細(xì)內(nèi)容,更多關(guān)于JVM類加載機(jī)制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springBoot項(xiàng)目中的static和templates文件夾的使用

    springBoot項(xiàng)目中的static和templates文件夾的使用

    本文主要介紹了springBoot項(xiàng)目中的static和templates文件夾的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • RocketMQ?Namesrv架構(gòu)工作原理詳解

    RocketMQ?Namesrv架構(gòu)工作原理詳解

    這篇文章主要為大家介紹了RocketMQ?Namesrv架構(gòu)工作原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 解決idea反編譯失敗無法查看jar包的源碼問題

    解決idea反編譯失敗無法查看jar包的源碼問題

    在IntelliJ IDEA中查看jar包源碼的兩種方法:下載反編譯軟件JD-GUI或安裝JavaBytecodeDecompiler插件
    2024-12-12
  • shiro 認(rèn)證流程操作

    shiro 認(rèn)證流程操作

    這篇文章主要介紹了shiro 認(rèn)證操作的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • spring mvc配置bootstrap教程

    spring mvc配置bootstrap教程

    這篇文章主要為大家詳細(xì)介紹了spring mvc配置bootstrap,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java中String類常用類型實(shí)例總結(jié)

    Java中String類常用類型實(shí)例總結(jié)

    在我們開發(fā)中經(jīng)常會用到很多的常用的工具類,這里做一個(gè)總結(jié),下面這篇文章主要給大家介紹了關(guān)于Java中String類常用類型的相關(guān)資料,String類代表字符串,需要的朋友可以參考下
    2021-12-12
  • 在JAVA?Web項(xiàng)目中動態(tài)加載DLL/SO文件的方法

    在JAVA?Web項(xiàng)目中動態(tài)加載DLL/SO文件的方法

    在JAVA?Web項(xiàng)目中,我們經(jīng)常需要調(diào)用一些第三方庫或者實(shí)現(xiàn)一些JAVA本身不支持的功能,這時(shí),我們可能會考慮使用JNI來調(diào)用DLL或SO文件,然而,因此,本文將介紹如何在JAVA?Web項(xiàng)目中動態(tài)加載DLL/SO文件,需要的朋友可以參考下
    2024-12-12
  • 使用Java實(shí)現(xiàn)一個(gè)解析CURL腳本小工具

    使用Java實(shí)現(xiàn)一個(gè)解析CURL腳本小工具

    文章介紹了如何使用Java實(shí)現(xiàn)一個(gè)解析CURL腳本的工具,該工具可以將CURL腳本中的Header解析為KV Map結(jié)構(gòu),獲取URL路徑、請求類型,解析URL參數(shù)列表和Body請求體,感興趣的小伙伴跟著小編一起來看看吧
    2025-02-02
  • Java基礎(chǔ)之序列化與反序列化詳解

    Java基礎(chǔ)之序列化與反序列化詳解

    這篇文章主要介紹了Java基礎(chǔ)之序列化與反序列化詳解,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • 深入理解注解與自定義注解的一些概念

    深入理解注解與自定義注解的一些概念

    今天給大家?guī)淼奈恼率亲⒔獾南嚓P(guān)知識,本文圍繞著注解與自定義注解的一些概念展開,文中詳細(xì)介紹了這些知識,需要的朋友可以參考下
    2021-06-06

最新評論

汤阴县| 稻城县| 洞头县| 梅河口市| 莱阳市| 台南市| 珠海市| 黔南| 临猗县| 晋宁县| 垣曲县| 阿拉善右旗| 通辽市| 来安县| 静安区| 枣阳市| 高要市| 耒阳市| 祁东县| 社旗县| 井冈山市| 中江县| 木里| 伊金霍洛旗| 讷河市| 军事| 务川| 武胜县| 淮滨县| 乌拉特前旗| 板桥市| 眉山市| 平江县| 怀安县| 大竹县| 鸡西市| 宣化县| 社旗县| 吴忠市| 平潭县| 和田市|