JVM深入原理(六)(二):雙親委派機制

目錄

6.5. 類加載器-雙親委派機制

6.5.1. 雙親委派機制-作用

6.5.2. 雙親委派機制-工作流程

6.5.3. 雙親委派機制-父加載器

6.5.4. 雙親委派機制-面試題

6.5.5. 雙親委派機制-代碼主動加載一個類

6.6. 類加載器-打破雙親委派機制

6.6.1. 打破委派-ClassLoader原理

6.6.2. 打破委派-打破的場景

6.6.3. 打破委派-自定義類加載器

6.6.4. 打破委派-線程上下文類加載器

6.6.5. 打破委派-OSGi模塊化

6.7. 類加載器-JDK8前后的類加載器


6.5. 類加載器-雙親委派機制

6.5.1. 雙親委派機制-作用

  • 雙親委派機制的作用:解決誰來加載類的問題
    1. 保證類加載的安全性:避免惡意代碼替換JDK中的核心類庫(比如:java.lang.String),確保核心類庫的完整性和安全性
    2. 避免類的重復加載:避免一個類被反復加載

6.5.2. 雙親委派機制-工作流程

  • 雙親委派機制的工作流程:當類加載器接收到加載類的任務時,會自底向上查找父類加載器是否加載過該類,是則結束這個過程,否則自頂向下進行加載該類

    • 自底向上工作流程:每個類加載器都有父類加載器,在類加載過程中,每個類加載器會檢查自身是否加載了該類,是則直接返回該類,否則將加載請求委派給父類加載器
    • 自底向上工作優點:只要一個類加載器加載過該類就會直接返回,避免了重復加載
    • 自頂向下工作流程:父類加載器會檢查當前類是否在自己的加載目錄中,是則加載后返回類對象,否則交給子類去加載
    • 自頂向下的優點:實現從上到下的加載優先級

6.5.3. 雙親委派機制-父加載器

  • 父加載器辨析:每個Java實現的類加載器中保存了一個成員變量叫"父"(parent)類加載器,可以理解為它的上級,但不是繼承關系

    • 應用程序類加載器的父類加載器:擴展類加載器
    • 擴展類加載器的父類加載器:null,啟動類加載器是JVM源碼中的,Java代碼是獲取不到的,但是代碼邏輯上啟動類加載器的父類加載器還是啟動類加載器
    • 啟動類加載器的父類加載器:啟動類加載器是用C++編寫的沒有父類加載器

6.5.4. 雙親委派機制-面試題

  • 啟動類加載器加載,根據雙親委派機制,它的優先級是最高的
  • 不能,因為啟動類加載器在程序啟動時已經加載了JDK提供的String類,接收到委派請求時會直接返回加載好的String類

6.5.5. 雙親委派機制-代碼主動加載一個類

  • 使用Java代碼可以主動加載一個類,有兩種實現方式:
    1. 調用Class.forName方法使當前類的類加載器去加載該類
    2. 調用getClassLoader方法獲取當前類的類加載器,再用類加載器的loadClass方法讓該類加載器加載指定的方法

6.6. 類加載器-打破雙親委派機制

6.6.1. 打破委派-ClassLoader原理

  • ClassLoader的原理就存在于四個核心方法中

  1. loadClass:
    • 作用:類加載的入口,內部實現雙親委派機制,內部會調用findClass
    • 代碼邏輯:
    1. 使用synchronized加鎖,防止多線程情況下出現類被多次加載
    2. 使用findLoadClass方法判斷這個類是否被當前類加載器加載過

      1. 未被加載過,則判斷父類加載器是否為空
        1. 不為空,則由父類加載器再判斷是否加載過這個類,依次類推
        2. 為空,則由啟動類加載器去加載
      1. 已被加載過,則直接返回這個類
    1. 執行完向上委派動作,但類任未被加載,則由當前類加載器加載
      1. 使用URLClassLoader的findClass方法獲取特定目錄下的Class字節碼文件,獲取文件對象
    1. 調用重載方法傳入resolve=false,不執行連接的過程
  1. findClass:由類加載器子類實現,獲取二進制數據時調用defineClass,比如URLClassLoader會根據文件路徑去獲取類文件的二進制數據
  2. defineClass:對類名進行校驗,調用JVM方法將字節碼信息加載到JVM運行時數據區
  3. resolveClass:執行類生命周期中的連接階段

6.6.2. 打破委派-打破的場景

  • Tomcat打破雙親委派機制的原因:Tomcat程序中運行多個Web應用時,如果Web應用中出現相同限定名的類,Tomcat要保證這些類能夠正常加載并運行且保證他們是不同的類,Tomcat就需要打破雙親委派機制

  • Tomcat打破雙親委派機制的方式:Tomcat為每一個Web應用提供了自定義類加載器來加載對應的類,這樣就實現了應用之間的類的隔離

6.6.3. 打破委派-自定義類加載器

  • 自定義類加載器打破雙親委派機制的方法:復寫ClassLoader中的loadClass方法
  • 常見問題:
    • 要加載的類名如果是以java.開頭,則會拋出安全性異常
    • 加載自定義的類都會有一個共同

      的父類Object,需要在代碼中交由父類加載器去加載

    • 自定義類加載器不手動指定parent會默認指定應用類加載
    • 兩個自定義類加載器加載同一個類會被認為是兩個對象,只有相同的類加載器+想通的類限定名才會被認為是一個對象

6.6.4. 打破委派-線程上下文類加載器

  • 線程上下文類加載器應用場景:JDBC(為例),JNDI
  • JDBC概述:JDBC提供DriverManager來管理jar包中引入的數據庫驅動,這樣就能在Java中操作不同的數據庫
  • JDBC打破委派困境:DriverManager位于rt.jar包中,由啟動類加載器加載,但依賴中的MySQL驅動實現類需要應用類加載器去加載

  • JDBC-SPI機制:SPI(Service Provider Interface)JDK內置服務發現機制,通過SPI快速找到Driver接口的實現類,類似Spring中的依賴注入
  • JDBC工作原理:MySQL為例

    1. 啟動類加載器加載位于rt.jar包的DriverManager
    2. 初始化DriverManager時,通過SPI機制加載jar包中的數據庫驅動實現類,將此實現類注冊到DriverManager中交由他管理
      • DriverManager利用SPI機制會去加載META-INF/services路徑下的java.sql.Driver文件,將MySQL實現了Driver接口的驅動實現類的全限定名寫入文件就可以被加載并管理
    1. SPI中利用了線程上下文類加載器(一般是應用類加載器)去加載獲取的Driver驅動類并創建對象

      • DriverManager使用ServiceLoader去加載Driver實現類,ServiceLoader中獲取線程上下文類加載器去加載實現類
    1. 這種由啟動類加載器加載的類去委派應用程序類加載器去加載類的方式打破了雙親委派機制
    2. 但是JDBC案例中都使用的是JDK提供的類加載器還是會走雙親委派流程,并沒有重寫loadClass,也可以說沒有打破雙親委派機制

6.6.5. 打破委派-OSGi模塊化

  • OSGi作用:OSGi是模塊化框架,解決早起JDK所有核心類都放在rt.包下難以管理的問題,它實現同級之間的類加載器委托加載.還使用類加載器實現了熱部署功能

6.7. 類加載器-JDK8前后的類加載器

  • JDK8之前版本:擴展類加載器和應用程序類加載器的源碼都位于rt.jar包下的sun.misc.Launcher.java中,這兩個加載器都實現了URLClassLoader,也可以說JDK8之前類加載器是按照類的位置去加載的

  • JDK8之后版本:JDK9引入了module概念,類不在放在jar包中加載,而是放在一個個jmod文件中,從jmod文件中加載文件,類加載器發生很多變化:

    1. 啟動類加載器由Java編寫,位于jdk.internal.loader.ClassLoader類中

      1. Java中的BootClassLoader繼承自BuiltinClassLoader實現從模塊中找到要加載的字節碼文件
      2. 啟動類加載器依然無法通過Java代碼找到保持了統一
    1. 擴展類加載器被替換成了平臺類加載器(Platform Class Loader)

      1. 平臺類加載器遵循模塊化方式加載字節碼文件,繼承關系從URLClassLoader變為BuiltinClassLoader,BuiltinClassLoader實現了從模塊中加載字節碼文件,平臺類加載器的存在更多是為老板的設計方案兼容,自己沒有特殊邏輯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74367.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 文件系統超詳解

一.磁盤 磁盤是計算機的主要存儲介質,它可以存儲大量二進制數據,即使斷電后也可以保證數據不會丟失。下面我們將了解磁盤的物理結構、存儲結構以及邏輯結構。 磁盤的存儲結構 1. 磁盤尋址的時候,基本單位既不是bit也不是byte,而…

2025年大模型與Transformer架構:重塑AI未來的科技革命

引言:一場關于智能的革命 想象一下,當你向一個虛擬助手提問時,它不僅能夠準確理解你的需求,還能生成一段流暢且富有邏輯的回答;或者當你上傳一張模糊的照片時,系統可以快速修復并生成高清版本——這一切的…

GO語言學習(16)Gin后端框架

目錄 ??前言 1.什么是前端?什么是后端?🌀 2.Gin框架介紹 🌷 3.Gin框架的基本使用 -Hello,World例子🌷 🌿入門示例 - Hello,World 💻補充(一些常用的網…

深入解析 Git Submodule:從基礎到高級操作指南

深入解析 Git Submodule:從基礎到高級操作指南 一、Git Submodule 是什么? git submodule 是 Git 提供的一個強大功能,允許在一個 Git 倉庫(主倉庫)中嵌入另一個獨立的 Git 倉庫(子模塊)。主倉…

電子電氣架構 --- EEA演進與芯片架構轉移

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

如何用deepseek生成流程圖

軟件準備: 在線流程圖【Flowchart Maker & Online Diagram Software】或【process on】 步驟: 1、用 【DeepSeek】生成 結構化內容(Mermaid文件) 1.1、向deepseek輸入指令:【幫我用mermaind寫出“某某”的具體…

【華為OD技術面試真題 - 技術面】- Java面試題(17)

華為OD面試真題精選 專欄:華為OD面試真題精選 目錄: 2024華為OD面試手撕代碼真題目錄以及八股文真題目錄 文章目錄 華為OD面試真題精選虛擬機分區1. **虛擬磁盤分區**2. **虛擬機的內存分區**3. **CPU分配**4. **虛擬網絡分區**5. **存儲虛擬化和分區**6. **虛擬機分區管理**…

Linux | I.MX6ULL內核及文件系統源碼結構(7)

01 類型 描述 備注 ARM 交叉編譯器 版本:4.9.4 提供軟件工具 Uboot 版本:2016.03 提供源碼 支持LCD顯示;支持網口; 支持 EMMC,NAND FLASH; 支持環境變量修改保存 Linux 內核 版本:4.1.15 提供…

0基礎入門scrapy 框架,獲取豆瓣top250存入mysql

一、基礎教程 創建項目命令 scrapy startproject mySpider --項目名稱 創建爬蟲文件 scrapy genspider itcast "itcast.cn" --自動生成 itcast.py 文件 爬蟲名稱 爬蟲網址 運行爬蟲 scrapy crawl baidu(爬蟲名) 使用終端運行太麻煩了,而且…

鴻蒙NEXT小游戲開發:猜小球

1. 引言 “猜小球”是一個經典的益智游戲,通常由一名表演者和多名參與者共同完成。表演者會將一個小球放在一個杯子下面,然后將三個杯子快速地交換位置,參與者則需要猜出最終哪個杯子下面有小球。本文將介紹如何使用HarmonyOS NEXT技術&…

網絡購物謹慎使用手機免密支付功能

在數字經濟蓬勃發展的當下,“免密支付”成為許多人消費時的首選支付方式。 “免密支付”的存在有其合理性。在快節奏的現代生活中,時間愈發珍貴,每節省一秒都可能帶來更高的效率。以日常通勤為例,上班族乘坐交通工具時&#xff0c…

記錄 | Android getWindow().getDecorView().setSystemUiVisibility(...)設置狀態欄屬性

純純的一邊開發一邊學習,是小白是菜鳥,單純的記錄和學習,大神勿噴,理解有錯望指正~ getWindow().getDecorView().setSystemUiVisibility(…) 該方法用于控制系統 UI(如狀態欄、導航欄)的可見性…

java虛擬機---JVM

JVM JVM,也就是 Java 虛擬機,它最主要的作用就是對編譯后的 Java 字節碼文件逐行解釋,翻譯成機器碼指令,并交給對應的操作系統去執行。 JVM 的其他特性有: JVM 可以自動管理內存,通過垃圾回收器回收不再…

VectorBT:使用PyTorch+LSTM訓練和回測股票模型 進階四

VectorBT:使用PyTorchLSTM訓練和回測股票模型 進階四 本方案融合 LSTM 時序預測與動態風險控制。系統采用混合架構,離線訓練構建多尺度特征工程和雙均線策略,結合在線增量更新持續優化模型。技術要點包括三層特征篩選、波動率動態倉位管理、混…

前端中rem,vh,vw

1. rem&#xff08;Root EM&#xff09; 參照對象 基準&#xff1a;相對于 根元素&#xff08;<html>&#xff09;的 font-size 計算。 默認情況下&#xff0c;瀏覽器的根 font-size 為 16px&#xff08;即 1rem 16px&#xff09;&#xff0c;但可通過 CSS 修改&#…

詳解 MySQL 常見的存儲引擎及它們之間的區別

MySQL 支持多種存儲引擎&#xff0c;每種引擎針對不同的應用場景提供了特定的特性和優化。下面是幾種常見的存儲引擎以及它們之間的主要區別&#xff1a; 常見存儲引擎 1. InnoDB&#xff08;重點&#xff09; 事務支持&#xff1a; 完全支持 ACID 事務&#xff0c;確保數據一…

html+css+js 實現一個貪吃蛇小游戲

目錄 游戲簡介 游戲功能與特點 如何玩轉貪吃蛇 游戲設計與實現 HTML結構 JavaScript核心實現 代碼結構&#xff1a; 效果 關于“其他游戲” 游戲簡介 貪吃蛇是一款經典的單人小游戲&#xff0c;玩家通過控制蛇的移動&#xff0c;吃掉食物來增加長度&#xff0c;避免撞…

GLSL(OpenGL 著色器語言)基礎語法

GLSL&#xff08;OpenGL 著色器語言&#xff09;基礎語法 GLSL&#xff08;OpenGL Shading Language&#xff09;是 OpenGL 計算著色器的語言&#xff0c;語法類似于 C 語言&#xff0c;但提供了針對 GPU 的特殊功能&#xff0c;如向量運算和矩陣運算。 著色器的開頭總是要聲明…

ngx_http_core_merge_srv_conf

定義在 src\http\ngx_http_core_module.c static char * ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) {ngx_http_core_srv_conf_t *prev parent;ngx_http_core_srv_conf_t *conf child;ngx_str_t name;ngx_http_server_name_t…

uni-app:firstUI框架的選擇器Select改造,添加一個搜索的插槽

<fui-select :show"showSiteType" :options"siteTypeList" textKey"dict_label" title"請選擇站點類型" confirm"chooseSiteType" close"onCloseSiteType"><template v-slot:search><view><…