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

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

這篇具有很好參考價值的文章主要介紹了深度解析JVM類加載器與雙親委派模型。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

概述

Java虛擬機(jī)(JVM)是Java程序運(yùn)行的核心,其中類加載器和雙親委派模型是JVM的重要組成部分。本文將深入討論這兩個概念,并解釋它們在實(shí)際開發(fā)中的應(yīng)用。

1. 什么是類加載器?

類加載器是JVM的一部分,負(fù)責(zé)加載Java類的字節(jié)碼文件。Java應(yīng)用程序中的每個類都必須由類加載器加載,類加載器將類的字節(jié)碼文件從磁盤或網(wǎng)絡(luò)加載到內(nèi)存中,并在JVM中創(chuàng)建一個對應(yīng)的Class對象。

類加載器工作原理示意圖

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

2. 什么是雙親委派模型?

雙親委派模型是一種類加載器之間的層次結(jié)構(gòu),它通過父類加載器委派給子類加載器加載類。當(dāng)一個類需要被加載時,首先會請求父類加載器加載,只有當(dāng)父類加載器無法加載時,才由子類加載器嘗試加載。這種層次結(jié)構(gòu)有助于保持類的唯一性,防止重復(fù)加載,提高安全性。

詳解原理分析

1. 類加載器的工作原理

類加載器按照三個階段加載類:加載、連接和初始化。加載器根據(jù)類的全名定位類的二進(jìn)制字節(jié)流,然后將其轉(zhuǎn)化為Class對象。

類的加載過程
/**
 * 類加載子系統(tǒng) 
 * 
 */
public class HelloLoader {
    public static void main(String[] args) {
        System.out.println("類加載....");
    }
}

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

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

加載階段
  1. 獲取類的二進(jìn)制字節(jié)流

    • 通過類的全限定名獲取定義此類的二進(jìn)制字節(jié)流。
  2. 轉(zhuǎn)化為方法區(qū)的運(yùn)行時數(shù)據(jù)結(jié)構(gòu)

    • 將字節(jié)流代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時數(shù)據(jù)結(jié)構(gòu)。
  3. 生成java.lang.Class對象

    • 在內(nèi)存中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的訪問入口。

加載class文件的方式

  • 本地系統(tǒng)中直接加載
  • 通過網(wǎng)絡(luò)獲?。╓eb Applet)
  • 從zip壓縮包中讀取(基礎(chǔ)為jar、war格式)
  • 運(yùn)行時計算生成(動態(tài)代理技術(shù))
  • 由其他文件生成(JSP應(yīng)用從數(shù)據(jù)庫提取)
  • 從加密文件中獲?。ǚ繡lass文件反編譯保護(hù))
鏈接階段
驗(yàn)證(Verify)
  • 目的:確保Class文件的字節(jié)流中包含信息符合虛擬機(jī)要求,保證加載的類正確性,不危害虛擬機(jī)自身安全。
  • 驗(yàn)證包括文件格式驗(yàn)證、元數(shù)據(jù)驗(yàn)證、字節(jié)碼驗(yàn)證、符號引用驗(yàn)證。
準(zhǔn)備(Prepare)
  • 為類變量分配內(nèi)存并設(shè)置默認(rèn)初始值,即零值。
  • 類變量會分配在方法區(qū)中。
  • 不包含使用final修飾的static,因?yàn)閒inal在編譯時就分配并顯式初始化。
  • 實(shí)例變量隨對象分配到Java堆中。
解析(Resolve)
  • 將常量池內(nèi)的符號引用轉(zhuǎn)換為直接引用。
  • 解析操作通常在初始化之后執(zhí)行。
  • 解析針對類、字段、類方法、接口方法、方法類型等。
初始化階段
  • 執(zhí)行類構(gòu)造器<clinit>()的過程,該方法由編譯器自動收集類中的類變量賦值動作和靜態(tài)代碼塊中的語句合并而來。
  • 靜態(tài)變量在準(zhǔn)備階段賦初值,初始化階段才是實(shí)際值。
  • 初始化順序按源文件中出現(xiàn)的順序執(zhí)行。
  • 父類的<clinit>()在子類的<clinit>()之前執(zhí)行,確保父類初始化完畢。
類加載器分類
  1. 啟動類加載器(Bootstrap ClassLoader)

    • 加載核心庫,不繼承ClassLoader,父加載器為null。
    • 加載java、javax、sun等開頭的類。
  2. 擴(kuò)展類加載器(Extension ClassLoader)

    • 加載擴(kuò)展目錄中的類庫。
  3. 應(yīng)用程序類加載器(AppClassLoader)

    • 加載classpath或系統(tǒng)屬性java.class.path指定路徑下的類庫。
    • 系統(tǒng)默認(rèn)的類加載器。
  4. 用戶自定義類加載器

    • 通過繼承ClassLoader實(shí)現(xiàn),用于隔離加載類、修改加載方式、擴(kuò)展加載源、防止源碼泄漏。

2. 雙親委派模型的工作流程

  • 當(dāng)一個類加載器收到加載請求時,首先檢查自己是否已經(jīng)加載了這個類。
  • 如果已加載,則直接返回Class對象。
  • 如果未加載,則將加載請求委派給父類加載器。
  • 這一過程一直遞歸進(jìn)行,直到根加載器,如果根加載器仍未加載,則由當(dāng)前加載器加載類。
深度解析JVM類加載器與雙親委派模型,jvm,jvm

怎么打破雙親委派模型?

打破雙親委派機(jī)制則不僅要繼承ClassLoader類,還要重寫loadClass和findClass方法。

知識點(diǎn)在實(shí)際開發(fā)的應(yīng)用

1. 模塊化開發(fā)

雙親委派模型在模塊化開發(fā)中得到廣泛應(yīng)用。通過將不同的功能模塊交給不同的類加載器加載,可以有效隔離模塊之間的類,確保模塊的獨(dú)立性。

案例詳解:

假設(shè)我們有一個大型電商應(yīng)用,分為用戶模塊、訂單模塊和支付模塊。每個模塊有自己的類加載器,負(fù)責(zé)加載模塊內(nèi)的類。這種模塊化的設(shè)計可以使得每個模塊獨(dú)立開發(fā)、測試和部署,降低了系統(tǒng)的耦合性。

2. 動態(tài)加載

類加載器的靈活性使得在運(yùn)行時動態(tài)加載類成為可能。這在某些框架和插件系統(tǒng)中得到了廣泛應(yīng)用,使系統(tǒng)更具可擴(kuò)展性。

案例詳解:

考慮一個圖形編輯器的插件系統(tǒng),用戶可以根據(jù)需要選擇性地加載不同的插件。每個插件都由一個獨(dú)立的類加載器加載,這樣用戶可以在運(yùn)行時添加或移除插件,無需重新啟動編輯器。

總結(jié)

本文深入探討了JVM中的類加載器和雙親委派模型,通過示意圖等多種呈現(xiàn)形式,從概念到原理再到實(shí)際應(yīng)用進(jìn)行了全方位的講解。了解這些知識對于理解Java程序的運(yùn)行機(jī)制,優(yōu)化性能以及實(shí)現(xiàn)模塊化開發(fā)和動態(tài)加載都具有重要意義。通過深入學(xué)習(xí)這些內(nèi)容,開發(fā)者可以更好地利用JVM的特性,寫出更健壯、高效的Java應(yīng)用程序。文章來源地址http://www.zghlxwxcb.cn/news/detail-798866.html

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

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

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

相關(guān)文章

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

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

    當(dāng)我們用java命令運(yùn)行某個類的main函數(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 的類鏡像,例如對 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í)例化的對象存在堆里; 看圖: 對象的hashcode值 解釋: 從圖中我們可以看出,從同一個類模板new出來三個對象(實(shí)例化

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

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

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

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

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

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

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

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

    1.當(dāng) AppClassLoader 去加載一個class時,它首先不會自己去嘗試加載這個類,而是把類加載請求委托給父加載器 ExtClassLoader 去完成。 2.當(dāng)ExtClassLoader去加載一個class時,它首先也不會去嘗試加載這個類,而是把類加載請求委托給父加載器 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ī)識別的(僅按照文件名,如rt.jar)類庫加載到虛

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

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

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

    2024年02月15日
    瀏覽(30)
  • 【JVM】打破雙親委派機(jī)制

    【JVM】打破雙親委派機(jī)制

    ? ???????個人主頁:五敷有你? ? ?? ??? 系列專欄:JVM ?? 穩(wěn)中求進(jìn),曬太陽 ClassLoader包含了四個核心方法 雙親委派機(jī)制核心代碼閱讀 閱讀雙親委派機(jī)制的核心代碼,分析如何通過自定義類加載器打破雙親委派機(jī)制。 打破雙親委派機(jī)制的核心就是講下面的代碼重寫

    2024年02月19日
    瀏覽(29)
  • 【jvm】雙親委派機(jī)制

    【jvm】雙親委派機(jī)制

    一、說明 1.java虛擬機(jī)對class文件采用的是按需加載的方式,當(dāng)需要使用該類時才會將它的class文件加載到內(nèi)存生成class對象 2.加載某個類的class文件時,java虛擬機(jī)采用雙親委派模式,即把請求交給由父類處理,是一種任務(wù)委派模式 3.jvm中表示兩個class對象是否為同一個類存在兩

    2024年02月11日
    瀏覽(59)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包