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

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

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

類加載運(yùn)行機(jī)制

類加載形如把.class文件,加載到內(nèi)存中,得到類對(duì)象這樣的過(guò)程

類加載一共分為五個(gè)步驟:

  1. 加載
  2. 驗(yàn)證
  3. 準(zhǔn)備
  4. 解析
  5. 初始化

加載

類加載的第一步是將編譯好的 Java 類的字節(jié)碼文件加載到 Java 虛擬機(jī)(JVM)中。類加載器會(huì)根據(jù)類的名稱找到對(duì)應(yīng)的字節(jié)碼文件,并將其讀取到內(nèi)存中。

驗(yàn)證

在驗(yàn)證階段,虛擬機(jī)會(huì)對(duì)加載的字節(jié)碼文件進(jìn)行合法性驗(yàn)證,包括文件格式的驗(yàn)證、驗(yàn)證字節(jié)碼的正確性和安全性等。這一步主要用于確保 class 文件不會(huì)引起虛擬機(jī)的錯(cuò)誤或安全問(wèn)題。

準(zhǔn)備

在準(zhǔn)備階段,虛擬機(jī)會(huì)為加載的類分配內(nèi)存空間,并設(shè)置類的默認(rèn)初始值。這些初始值包括零值(0、false或null)或者用戶所設(shè)置的初始值。

解析

解析階段是將常量池中的符號(hào)引用轉(zhuǎn)換成直接引用的過(guò)程。符號(hào)引用包括類、接口、字段和方法等的引用。解析操作的主要目的是為了創(chuàng)建對(duì)應(yīng)的直接引用,以便于后續(xù)的內(nèi)存空間分配、類的初始化和方法的調(diào)用等操作。

在 Java 語(yǔ)言中,當(dāng)我們?cè)诖a中引用一個(gè)類、接口、字段或方法時(shí),實(shí)際上是通過(guò)符號(hào)引用來(lái)表示的。符號(hào)引用是一種符號(hào)化的描述方式,它并不指向具體的內(nèi)存地址或偏移量,而是通過(guò)符號(hào)的形式來(lái)描述所引用的目標(biāo)。

舉個(gè)例子,假設(shè)有以下代碼片段:


public class ClassA {
    public void methodA() {
        ClassB b = new ClassB();
        b.methodB();
    }
}

public class ClassB {
    public void methodB() {
        System.out.println("Method B is called");
    }
}

ClassAmethodA方法中,我們創(chuàng)建了一個(gè)ClassB的實(shí)例,并調(diào)用了它的methodB方法。

在解析階段,虛擬機(jī)會(huì)進(jìn)行如下的符號(hào)引用轉(zhuǎn)換為直接引用的過(guò)程:

  1. 虛擬機(jī)會(huì)解析ClassA對(duì)ClassB的符號(hào)引用,找到對(duì)應(yīng)的類ClassB的描述符和其他信息。
  2. 虛擬機(jī)會(huì)在內(nèi)存中為ClassB分配空間,創(chuàng)建ClassB的實(shí)例對(duì)象。
  3. 虛擬機(jī)會(huì)將b變量與實(shí)際的內(nèi)存地址關(guān)聯(lián)起來(lái),這樣可以通過(guò)b來(lái)訪問(wèn)ClassB對(duì)象。
  4. 虛擬機(jī)會(huì)通過(guò)b.methodB()來(lái)調(diào)用ClassBmethodB方法,這里的methodB是一個(gè)直接引用。

所以,在解析階段,虛擬機(jī)將符號(hào)引用轉(zhuǎn)換為直接引用,這樣就能夠通過(guò)直接引用來(lái)訪問(wèn)和使用目標(biāo)類的字段或方法。通過(guò)這種方式,虛擬機(jī)可以動(dòng)態(tài)地解析和鏈接類之間的關(guān)系,實(shí)現(xiàn)類的動(dòng)態(tài)綁定和調(diào)用。

初識(shí)化

在初始化階段,虛擬機(jī)會(huì)執(zhí)行類的初始化代碼,例如靜態(tài)變量的賦值和靜態(tài)代碼塊的執(zhí)行等。
這一階段的觸發(fā)條件包括:

  1. 類的實(shí)例被創(chuàng)建;
  2. 類的靜態(tài)方法被調(diào)用;
  3. 類中的靜態(tài)字段被賦值。

類的初始化是類加載的最后一個(gè)步驟。

雙親委派模型

雙親委派模型(又稱為雙親委派機(jī)制)是Java類加載機(jī)制中的一種設(shè)計(jì)思想和實(shí)現(xiàn)方式。
類加載機(jī)制是Java虛擬機(jī)(JVM)加載類的過(guò)程,而雙親委派模型是指在類加載過(guò)程中,JVM通過(guò)委派的方式來(lái)從不同的類加載器去加載類。這個(gè)機(jī)制主要用于確保類的一致性、安全性和避免重復(fù)加載。

在JVM中,有三個(gè)類加載器:

  • BootStrap ClassLoader 負(fù)責(zé)加載java標(biāo)志庫(kù)中的類
  • Extension ClassLoader 負(fù)責(zé)加載一些非標(biāo)準(zhǔn)的但是是Sun/Oracle 擴(kuò)展的庫(kù)的類
  • Application ClassLpader 負(fù)責(zé)加載項(xiàng)目中自己寫(xiě)的類以及第三方庫(kù)中的一些類

解析Java類加載的運(yùn)行機(jī)制和雙親委派模型,JavaEE,java,開(kāi)發(fā)語(yǔ)言,學(xué)習(xí),jvm
一個(gè)類加載器收到了類加載的請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類,而是把這個(gè)請(qǐng)求委派給父類加載器去完成,每一個(gè)層次的類加載器都是如此,因此所有的加載請(qǐng)求最 終都應(yīng)該傳送到最頂層的啟動(dòng)類加載器中,只有當(dāng)父加載器反饋?zhàn)约簾o(wú) 法完成這個(gè)加載請(qǐng)求(它的搜索范圍中沒(méi)有找到所需的類)時(shí),子加載器才會(huì)嘗試自己去完成加載。

雙親委派模型基于以下幾個(gè)原則:

  1. 父類加載器優(yōu)先:如果一個(gè)類需要被加載,JVM首先會(huì)把這個(gè)任務(wù)委派給父類加載器來(lái)完成。
  2. 雙親委派:父類加載器在接收到加載請(qǐng)求后,會(huì)先檢查自己是否已經(jīng)加載了這個(gè)類。如果已經(jīng)加載,則直接返回該類的Class對(duì)象。如果沒(méi)有加載,則將加載請(qǐng)求向上委派給父類的父類加載器,以此類推,直到頂層的啟動(dòng)類加載器。只有當(dāng)父類加載器不能完成加載任務(wù)時(shí),子加載器才會(huì)嘗試自己去加載。
    3.** 緩存機(jī)制:如果一個(gè)類被某個(gè)加載器加載成功后,這個(gè)加載器會(huì)將加載結(jié)果緩存起來(lái),下次再加載同樣的類時(shí)直接返回緩存的結(jié)果**。

通過(guò)雙親委派模型,可以有效地避免類的重復(fù)加載和類的不一致性問(wèn)題。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-556384.html

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

本文來(lái)自互聯(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類加載器與雙親委派模型

    深度解析JVM類加載器與雙親委派模型

    Java虛擬機(jī)(JVM)是Java程序運(yùn)行的核心,其中類加載器和雙親委派模型是JVM的重要組成部分。本文將深入討論這兩個(gè)概念,并解釋它們?cè)趯?shí)際開(kāi)發(fā)中的應(yīng)用。 1. 什么是類加載器? 類加載器是JVM的一部分,負(fù)責(zé)加載Java類的字節(jié)碼文件。Java應(yīng)用程序中的每個(gè)類都必須由類加載器

    2024年01月17日
    瀏覽(109)
  • 類加載 - 雙親委派機(jī)制詳解

    類加載 - 雙親委派機(jī)制詳解

    啟動(dòng)類加載器(Bootstrap Class Loader):它是Java虛擬機(jī)的一部分,負(fù)責(zé)加載Java核心類庫(kù),如java.lang包中的類。它是最頂層的類加載器,由C++實(shí)現(xiàn),不是Java類。 擴(kuò)展類加載器(Extension Class Loader):它負(fù)責(zé)加載Java的擴(kuò)展類庫(kù),位于JRE的lib/ext目錄下。它是由Java編寫(xiě)的類加載器,是

    2024年02月12日
    瀏覽(27)
  • 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í),首先需要通過(guò)類加載器把類加載到JVM,本文主要說(shuō)明類加載機(jī)制和其具體實(shí)現(xiàn)雙親委派模式。 類加載過(guò)程 : 類加載的過(guò)程是將類的字節(jié)碼加載到內(nèi)存中的過(guò)程,主要包括:加載--鏈接--初始化,其中鏈接還包括驗(yàn)證、準(zhǔn)備、

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

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

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

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

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

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

    2024年02月04日
    瀏覽(26)
  • JVM類加載基本流程及雙親委派模型

    JVM類加載基本流程及雙親委派模型

    一個(gè)運(yùn)行起來(lái)的Java進(jìn)程就是一個(gè)JVM虛擬機(jī),這就需要從操作系統(tǒng)中申請(qǐng)一片內(nèi)存區(qū)域。JVM申請(qǐng)到內(nèi)存之后,會(huì)把這個(gè)內(nèi)存劃分為幾個(gè)區(qū)域,每個(gè)區(qū)域都有各自的作用。 一般會(huì)把內(nèi)存劃分為 四個(gè)區(qū)域 : 方法區(qū) (也稱 \\\"元數(shù)據(jù)區(qū)\\\"), 堆區(qū) , 棧區(qū) , 程序計(jì)數(shù)器 。 (1)方法區(qū):

    2024年04月23日
    瀏覽(36)
  • JVM的類加載的過(guò)程以及雙親委派模型

    JVM的類加載的過(guò)程以及雙親委派模型

    目錄 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的類加載器

    2023年04月20日
    瀏覽(33)
  • [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雙親委派和類加載器

    Java雙親委派和類加載器

    Java類加載分為以下幾個(gè)步驟: 只有 加載步驟 中的 讀取二進(jìn)制流與初始化部分 ,能夠被上層開(kāi)發(fā)者,也就是大部分的Java程序員控制,而 剩下的所有步驟 ,都是由JVM掌控,其中細(xì)節(jié)由JVM的開(kāi)發(fā)人員處理,對(duì)上層開(kāi)發(fā)者來(lái)說(shuō)是個(gè)黑盒。 面向?qū)ο骃OLID: 單一功能、 開(kāi)閉 、里氏替

    2023年04月26日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包