国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JVM的類加載的過程以及雙親委派模型

這篇具有很好參考價(jià)值的文章主要介紹了JVM的類加載的過程以及雙親委派模型。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1、加載 (加載字節(jié)碼文件,生成.class對(duì)象)

2、驗(yàn)證(驗(yàn)證Class文件是否符合規(guī)范)?

3、準(zhǔn)備 (為靜態(tài)變量分配內(nèi)存并設(shè)置變量初始值)

4、解析(初始化常量池中的一些常量)?

5、初始化(初始化對(duì)象,并為靜態(tài)變量賦值)?

總結(jié):

雙親委派模型:??

JVM的類加載器(主要有3個(gè)):?

標(biāo)準(zhǔn)庫(kù)中的String類是怎樣被加載的??

自定義的類如何加載??

類加載一定要使用雙親委派模型嗎??

為什么Tomcat不使用雙親委派模型??

Tomcat是怎么實(shí)現(xiàn)webapps下各個(gè)web應(yīng)用程序的隔離的?


類加載過程簡(jiǎn)單來說就是把.class文件加載到內(nèi)存中構(gòu)造出類對(duì)象?

JVM的類加載過程要經(jīng)歷以下幾個(gè)階段:加載->連接->初始化?

其中連接階段可以細(xì)分成:驗(yàn)證->準(zhǔn)備->解析

所以也可以說JVM的類加載過程是這幾個(gè)階段:?加載->驗(yàn)證->準(zhǔn)備->解析->初始化

1、加載 (加載字節(jié)碼文件,生成.class對(duì)象)

首先要進(jìn)行加載的過程。加載過程就是要找到.class文件,打開并讀取它。在這個(gè)過程中要先從.class文件中獲取到這個(gè)類的二進(jìn)制字節(jié)流,然后將這個(gè)字節(jié)流代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法運(yùn)行時(shí)的數(shù)據(jù)結(jié)構(gòu),最后在內(nèi)存中生成一個(gè)代表該類的java.long.Class對(duì)象,然后把這個(gè)放到方法區(qū),作為該類的數(shù)據(jù)訪問接口。?

二進(jìn)制的.class文件包含內(nèi)容:

JVM的類加載的過程以及雙親委派模型

詳情見Java虛擬機(jī)規(guī)范手冊(cè):https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html?

2、驗(yàn)證(驗(yàn)證Class文件是否符合規(guī)范)?

在進(jìn)行讀取前,要先驗(yàn)證Class文件字節(jié)流中包含的信息是否符合Java虛擬機(jī)規(guī)范的約束條件,?驗(yàn)證的內(nèi)容包括:文件格式,字節(jié)碼,符號(hào)引用

3、準(zhǔn)備 (為靜態(tài)變量分配內(nèi)存并設(shè)置變量初始值)

準(zhǔn)備階段是正式為類中的屬性(static修飾的變量)分配內(nèi)存和進(jìn)行初始值的設(shè)定

如:public static int num=123;在準(zhǔn)備階段并不會(huì)對(duì)num進(jìn)行賦值123,而是先設(shè)定num=0;

4、解析(初始化常量池中的一些常量)?

前面我們說到.class文件中包含的內(nèi)容,在這一階段,JVM會(huì)將符號(hào)引用轉(zhuǎn)化為直接引用,也就是在這一階段,會(huì)對(duì)常量進(jìn)行一個(gè)初始化。

5、初始化(初始化對(duì)象,并為靜態(tài)變量賦值)?

在這一階段,Java虛擬機(jī)開始真正的執(zhí)行類中的代碼,進(jìn)行對(duì)象的初始化,并且為靜態(tài)變量賦值,比如前面的?num 就會(huì)在這一階段被賦值為123,而不是原來的0了。

總結(jié):

JVM的類加載的過程以及雙親委派模型

雙親委派模型:??

雙親委派模型屬于一種類加載的機(jī)制。

前面我們說到了類加載的過程經(jīng)歷了加載-> 連接->初始化的過程。其中加載的過程是加載字節(jié)碼文件,生成.class對(duì)象。在這個(gè)加載的過程中類加載器發(fā)揮著至關(guān)重要的作用,而雙親委派模型就是描述類加載器是如何根據(jù)全限定名(類名+包名,如java.long.String)找到.class文件的過程,這個(gè)過程屬于加載過程的靠前的階段。

JVM的類加載器(主要有3個(gè)):?

JVM的類加載器主要是下面這3個(gè):

BootSharpClassLoader(負(fù)責(zé)加載標(biāo)準(zhǔn)庫(kù)當(dāng)中的類(如List,String))

ExtensionClassLoader(負(fù)責(zé)加載JDK擴(kuò)展庫(kù)當(dāng)中的類)

ApplicationClassLoader(負(fù)責(zé)加載當(dāng)前目錄當(dāng)中的類)?

除此之外,用戶也可以自定義類加載器:User-DefinedClassLoader,一般沒有使用自定義加載器,所以默認(rèn)就是上面的那3種類加載器。每個(gè)類加載器負(fù)責(zé)加載自己負(fù)責(zé)的目錄。?

下圖來源于博客:?JVM類加載器-CSDN博客

JVM的類加載的過程以及雙親委派模型

雙親委派模型就是描述了上述的類加載器之間是怎么配合的?。

例子(沒有自定義類加載器):

標(biāo)準(zhǔn)庫(kù)中的String類是怎樣被加載的??

第一步:程序啟動(dòng),進(jìn)入ApplicationClassLoader類加載器

第二步:在ApplicationClassLoader中檢查其父類加載器ExtensionClassLoader是否被加載過,如果沒有加載過就進(jìn)入到ExtensionClassLoader中

第三步:在ExtensionClassLoader中檢查最高父類加載器BootSharpClassLoader是否加載過,沒有就進(jìn)入BootSharpClassLoader中。?

最后在BootSharpClassLoader中查找標(biāo)準(zhǔn)庫(kù)的目錄:java.long.String,完成String的加載。

JVM的類加載的過程以及雙親委派模型

自定義的類如何加載??

如果是自定義的類,也會(huì)經(jīng)歷上述過程,但是由于在BootSharpClassLoader目錄中無法找到該自定義的類就會(huì)回到上一級(jí)ExtensionClassLoader中進(jìn)行加載,如果還是找不到就會(huì)到上一級(jí)ApplicationClassLoader當(dāng)中進(jìn)行加載,然后再當(dāng)前目錄中找到了自定義的類進(jìn)行加載。

JVM的類加載的過程以及雙親委派模型

?如果在最后沒有成功加載就會(huì)拋出ClassNotFoundException。

雙親委派模型的優(yōu)勢(shì):

當(dāng)用戶自定義的類與標(biāo)準(zhǔn)庫(kù)中的類的全限定名重復(fù)了,依然可以準(zhǔn)確的加載標(biāo)準(zhǔn)庫(kù)中的類,而不是自定義的類,比如自定義一個(gè)和標(biāo)準(zhǔn)庫(kù)中的java.long.String的一樣的類,當(dāng)類加載器加載到BootSharpClassLoader的時(shí)候就不會(huì)再返回了,就加載的是標(biāo)準(zhǔn)庫(kù)中的類。??

類加載一定要使用雙親委派模型嗎??

不一定,因?yàn)殡p親委派模型只是類加載機(jī)制中的一種,是適用于JVM的類加載的,而像Tomcat加載webapps中的類則沒有使用雙親委派模型。

為什么Tomcat不使用雙親委派模型??

首先Tomcat中的webapps下面有很多的web應(yīng)用程序。

第一個(gè)原因:隔離性,為了保證每個(gè)web應(yīng)用程序之間互不干擾,可以相互獨(dú)立互不干擾的加載和銷毀各自的類,不會(huì)因?yàn)閣eb程序因?yàn)橹孛蛘甙姹静煌仍蛟斐蓻_突。

第二個(gè)原因:方便動(dòng)態(tài)的重新加載已經(jīng)加載過的類,使得開發(fā)和部署的效率更高。?

Tomcat是怎么實(shí)現(xiàn)webapps下各個(gè)web應(yīng)用程序的隔離的?

Tomcat自定義了一個(gè)webapp類加載器,并且給每一個(gè)web應(yīng)用程序都創(chuàng)建一個(gè)類加載器,所以不同的類加載器加載的就是不同的類了。?文章來源地址http://www.zghlxwxcb.cn/news/detail-419034.html

到了這里,關(guān)于JVM的類加載的過程以及雙親委派模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JVM:雙親委派機(jī)制&類加載器

    JVM:雙親委派機(jī)制&類加載器

    Java運(yùn)行時(shí)環(huán)境有一個(gè) java.lang 包,里面有一個(gè) ClassLoader 類 我們自定義一個(gè) String 類在 java.lang 包下,下面的main方法報(bào)錯(cuò)。原因是: 根據(jù)雙親委派機(jī)制,會(huì)向上找先是找到了 應(yīng)用程序加載器(appClassLoader) ,然后向上找 擴(kuò)展類加載器(ExtClassLoader) ,最后找 根類加載器(Boot Strap

    2024年02月01日
    瀏覽(24)
  • JVM類加載和雙親委派機(jī)制

    JVM類加載和雙親委派機(jī)制

    當(dāng)我們用java命令運(yùn)行某個(gè)類的main函數(shù)啟動(dòng)程序時(shí),首先需要通過類加載器把類加載到JVM,本文主要說明類加載機(jī)制和其具體實(shí)現(xiàn)雙親委派模式。 類加載過程 : 類加載的過程是將類的字節(jié)碼加載到內(nèi)存中的過程,主要包括:加載--鏈接--初始化,其中鏈接還包括驗(yàn)證、準(zhǔn)備、

    2024年02月09日
    瀏覽(30)
  • Java JVM類加載階段 雙親委派模式

    Java JVM類加載階段 雙親委派模式

    加載 將類的字節(jié)碼載入方法區(qū)中,內(nèi)部采用 C++ 的 instanceKlass 描述 java 類,它的重要 field 有: _java_mirror 即 java 的類鏡像,例如對(duì) String 來說,就是 String.class,作用是把 klass 暴露給 java 使用 _super 即父類 _fields 即成員變量 _methods 即方法 _constants 即常量池 _class_loader 即類加載器

    2024年01月25日
    瀏覽(32)
  • 【JAVA基礎(chǔ)】JVM之類加載--雙親委派機(jī)制

    【JAVA基礎(chǔ)】JVM之類加載--雙親委派機(jī)制

    1. 類加載的過程 描述: 我們寫的 .java 文件通過編譯成字節(jié)碼文件 .class 文件,然后再通過我們的類加載器:Class Loader,反射以后,類模板存在方法區(qū),把實(shí)例化的對(duì)象存在堆里; 看圖: 對(duì)象的hashcode值 解釋: 從圖中我們可以看出,從同一個(gè)類模板new出來三個(gè)對(duì)象(實(shí)例化

    2024年01月23日
    瀏覽(26)
  • JVM(類的加載與ClassLoader、雙親委派機(jī)制)

    JVM(類的加載與ClassLoader、雙親委派機(jī)制)

    類在內(nèi)存中完整的生命周期: 加載--使用--卸載 。其中加載過程又分為: 裝載、鏈接、初始化 三個(gè)階段。 當(dāng)程序主動(dòng)使用某個(gè)類時(shí),如果該類還未被加載到內(nèi)存中,系統(tǒng)會(huì)通過加載、鏈接、初始化三個(gè)步驟來對(duì)該類進(jìn)行初始化。如果沒有意外,JVM將會(huì)連續(xù)完成這三個(gè)步驟,

    2024年02月03日
    瀏覽(31)
  • 【JVM從入門到實(shí)戰(zhàn)】(六)類加載器的雙親委派機(jī)制

    【JVM從入門到實(shí)戰(zhàn)】(六)類加載器的雙親委派機(jī)制

    在Java中如何使用代碼的方式去主動(dòng)加載一個(gè)類呢? 方式1:使用Class.forName方法,使用當(dāng)前類的類加載器去加載指定的類。 方式2:獲取到類加載器,通過類加載器的loadClass方法指定某個(gè)類加載器加載。 雙親委派機(jī)制: 自底向上查找是否加載過,再由頂向下進(jìn)行加載 面試題:

    2024年02月04日
    瀏覽(26)
  • java八股文面試[JVM]——雙親委派模型

    java八股文面試[JVM]——雙親委派模型

    1.當(dāng) AppClassLoader 去加載一個(gè)class時(shí),它首先不會(huì)自己去嘗試加載這個(gè)類,而是把類加載請(qǐng)求委托給父加載器 ExtClassLoader 去完成。 2.當(dāng)ExtClassLoader去加載一個(gè)class時(shí),它首先也不會(huì)去嘗試加載這個(gè)類,而是把類加載請(qǐng)求委托給父加載器 BootstrapClassLoader 去完成。 3.如果BootstrapClas

    2024年02月11日
    瀏覽(35)
  • [JVM] 3. 類加載子系統(tǒng)(2)-- 類加載器、雙親委派機(jī)制(JDK1.8及之前)及其他

    [JVM] 3. 類加載子系統(tǒng)(2)-- 類加載器、雙親委派機(jī)制(JDK1.8及之前)及其他

    JDK1.8及之前和JDK9及之后的雙親委派模型是不一樣的,這里學(xué)習(xí)了1.8及以前的雙親委派模型,記錄筆記 1.8之前主要是這幾種類加載器: 負(fù)責(zé)將存放在 JAVA_HOMElib 目錄中的,或者被-Xbootclasspath參數(shù)所指定的路徑中的,并且是虛擬機(jī)識(shí)別的(僅按照文件名,如rt.jar)類庫(kù)加載到虛

    2024年02月16日
    瀏覽(28)
  • 解析Java類加載的運(yùn)行機(jī)制和雙親委派模型

    解析Java類加載的運(yùn)行機(jī)制和雙親委派模型

    類加載形如把.class文件,加載到內(nèi)存中,得到類對(duì)象這樣的過程 類加載一共分為五個(gè)步驟: 加載 驗(yàn)證 準(zhǔn)備 解析 初始化 加載 類加載的第一步是將編譯好的 Java 類的字節(jié)碼文件加載到 Java 虛擬機(jī)(JVM)中。類加載器會(huì)根據(jù)類的名稱找到對(duì)應(yīng)的字節(jié)碼文件,并將其讀取到內(nèi)存

    2024年02月15日
    瀏覽(30)
  • 深入理解Java類加載機(jī)制中的雙親委派模型--根據(jù)源碼探討

    深入理解Java類加載機(jī)制中的雙親委派模型--根據(jù)源碼探討

    前言: 今天和大家探討一道Java中經(jīng)典的面試題,這道面試題經(jīng)常出現(xiàn)在各個(gè)公司的面試中,本篇文章主要講解 ava類加載機(jī)制中的雙親委派模型 的知識(shí)。該專欄比較適合剛?cè)肟覬ava的小白以及準(zhǔn)備秋招的大佬閱讀。 如果文章有什么需要改進(jìn)的地方歡迎大佬提出,對(duì)大佬有幫助

    2024年02月14日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包