JVM 雙親委派機制詳解

文章目錄

  • 1. 雙親委派機制
  • 2. 證明
  • 3. 優勢與劣勢


在這里插入圖片描述

在這里插入圖片描述


1. 雙親委派機制

類加載器用來把類加載到 Java 虛擬機中。從JDK1.2版本開始,類的加載過程采用雙親委派機制,這種機制能更好地保證 Java 平臺的安全。

1.定義
如果一個類加載器在接到加載類的請求時,它首先不會自己嘗試去加載這個類,而是把這個請求任務委托給父類加載器去完成,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回。只有父類加載器無法完成此加載任務時,才自己去加載。

2.本質
規定了類加載的順序是:引導類加載器先加載,若加載不到,由擴展類加載器加載,若還加載不到,才會由系統類加載器或自定義的類加載器進行加載。


在這里插入圖片描述
在這里插入圖片描述


2. 證明

雙親委派機制在 java.lang.ClassLoader.loadClass(String,boolean) 接口中體現。該接口的邏輯如下:
(1)先在當前加載器的緩存中查找有無目標類,如果有,直接返回。
(2)判斷當前加載器的父加載器是否為空,如果不為空,則調用parent.loadClass(name, false)接口進行加載。
(3)反之,如果當前加載器的父類加載器為空,則調用findBootstrapClassOrNull(name)接口,讓引導類加載器進行加載。
(4)如果通過以上3條路徑都沒能成功加載,則調用findClass(name)接口進行加載。該接口最終會調用java.lang.ClassLoader接口的defineClass系列的native接口加載目標 Java 類。
雙親委派的模型就隱藏在這第2和第3步中。

2.舉例
假設當前加載的是java.lang.Object這個類,很顯然,該類屬于JDK中核心得不能再核心的一個類,因此一定只能由引導類加載器進行加載。當JVM準備加載javaJang.Object時,JVM默認會使用系統類加載器去加載,按照上面4步加載的邏輯,在第1步從系統類的緩存中肯定查找不到該類,于是進入第2步。由于從系統類加載器的父加載器是擴展類加載器,于是擴展類加載器繼續從第1步開始重復。由于擴展類加載器的緩存中也一定査找不到該類,因此進入第2步。擴展類的父加載器是null,因此系統調用findClass(String), 最終通過引導類加載器進行加載。


3. 優勢與劣勢

1.雙親委派機制優勢
避免類的重復加載,確保一個類的全局唯一性
Java類隨著它的類加載器一起具備了一種帶有優先級的層次關系,通過這種層級關系可以避免類的重復加載,當父親已經加載了該類時,就沒有必要子ClassLoader再加載一次。
保護程序安全,防止核心API被隨意篡改

2.雙親委托模式的弊端
檢查類是否加載的委托過程是單向的,這個方式雖然從結構上說比較清晰,使各個ClassLoader的職責非常明確,但是同時會帶來一個問題,即頂層的ClassLoader無法訪問底層的ClassLoader所加載的類。

通常情況下,啟動類加載器中的類為系統核心類,包括一些重要的系統接口,而在應用類加載器中,為應用類。按照這種模式,應用類訪問系統類自然是沒有問題,但是系統類訪問應用類就會出現問題。比如在系統類中提供了一個接口,該接口需要在應用類中得以實現,該接口還綁定一個工廠方法,用于創建該接口的實例,而接口和工廠方法都在啟動類加載器中。這時,就會出現該工廠方法無法創建由應用類加載器加載的應用實例的問題。

3.結論
由于Java虛擬機規范并沒有明確要求類加載器的加載機制一定要使用雙親委派模型,只是建議采用這種方式而已。
比如在Tomcat中,類加載器所采用的加載機制就和傳統的雙親委派模型有一定區別,當缺省的類加載器接收到一個類的加載任務時,首先會由它自行加載,當它加載失敗時,才會將類的加載任務委派給它的超類加載器去執行,這同時也是Servlet規范推薦的一種做法。


在這里插入圖片描述



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

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

相關文章

react組件渲染性能優化之函數組件-useCallback使用

useCallback主要就是對函數進行緩存,useCallBack這個Hooks主要是解決React.memo不能緩存事件的問題 useCallBack(fn, dependencies) :fn想要緩存的函數,dependencies有關是否更新 fn 的所有響應式值的一個列表 比如:UseCallBackOptimize組件…

(done) NLP+HMM 協作,還有維特比算法

參考視頻:https://www.bilibili.com/video/BV1aP4y147gA/?p2&spm_id_frompageDriver&vd_source7a1a0bc74158c6993c7355c5490fc600 (這實際上是 “序列標注任務”) HMM 的訓練和預測如下圖 訓練過程:我們首先先給出一個語…

做一個桌面懸浮翻頁時鐘

毛玻璃效果翻頁桌面懸浮時鐘,TopMost(Topmost“True”),不在任務欄顯示(ShowInTaskbar“False”),在托盤區顯示圖標,雙擊托盤區圖標實現最小化和還原,右鍵托盤圖標可選“…

常見網絡攻擊及解決方案

網絡安全是開發中常常會遇到的情況,為什么會遇到網絡攻擊,網絡攻擊是如何進行的,如何抵御網絡攻擊,都是我們需要思考的問題。 為什么會遇到網絡攻擊? 以下是一些主要的因素: 技術漏洞:軟件或操…

web學習記錄--(5.14)

1.Sublime安裝與漢化 直接點擊windows即可下載,安裝即可 Thank You - Sublime Text 漢化 Install Package ChineseLocalzation 2.PHPstorm下載以及激活,漢化 直接下載,然后找激活碼激活即可 漢化 plugins(插件)/chinese&…

SpringBoot接收參數的19種方式

https://juejin.cn/post/7343243744479625267?share_token6D3AD82C-0404-47A7-949C-CA71F9BC9583

未授權訪問:ZooKeeper 未授權訪問漏洞

目錄 1、漏洞原理 2、環境搭建 3、未授權訪問 防御手段 今天繼續學習各種未授權訪問的知識和相關的實操實驗,一共有好多篇,內容主要是參考先知社區的一位大佬的關于未授權訪問的好文章,還有其他大佬總結好的文章: 這里附上大…

在Ubuntu中如何解壓zip壓縮包??

2024年5月15日,周三上午 使用 unzip 命令 unzip 文件名.zip這會將壓縮包中的內容解壓到當前目錄。如果想解壓到特定目錄,可以使用 -d 選項,例如: unzip 文件名.zip -d 目標目錄使用 7-zip 還可以安裝 7-zip 工具來解壓 ZIP 文件。…

【Python探索之旅】冒泡排序(三種方法)

前言 算法步驟: 代碼實現 方法一、嵌套循環 方法二 while循環 方法三、使用生成器表達式 解釋: 時間復雜度: 完結撒花 前言 冒泡排序是一種簡單的排序算法,它也是一種穩定排序算法。其實現原理是重復掃描待排序序列&#xf…

2025年第十一屆北京國際印刷技術展覽會

2025年第十一屆北京國際印刷技術展覽會 展覽時間:2025年5月15-19日 展覽地點:北京中國國際展覽中心(順義館) 主辦單位:中國印刷及設備器材工業協會中國國際展覽中心集團有限公司 承辦單位:北京中印協華港國…

海思Hi3065H 200MHz 高性能 RISCV32 A2 MCU

這是一款海思自研的RISCV32內核的高性能實時控制專用MCU, 具有高性能、高集成度、高可靠性、易開發的特點,同時還有嵌入式AI能力。 CPU ? RISC-V200MHzFPU 存儲 ? Up to 152KB Code Flash ? 8KB Data Flash ? 16KB SRAM 個人認為這是MCU梯隊非常…

[Linux][網絡][高級IO][IO多路轉接][select][poll]詳細講解

目錄 1.IO多路轉接之select1.初識select2.select()3.關于fd_set結構4.關于timeval結構5.理解select執行過程6.select就緒條件7.select特點8.select優點(任何一個多路轉接方案,都具備)9.select缺點10.select的一般編寫代碼的模式11.思考 && 問題 2.IO多路轉接…

【PB案例學習筆記】-02 目錄瀏覽器

寫在前面 這是PB案例學習筆記系列文章的第二篇,該系列文章適合具有一定PB基礎的讀者, 通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼,小凡都上…

基于Django實現的(bert)深度學習文本相似度檢測系統設計

基于Django實現的(bert)深度學習文本相似度檢測系統設計 開發語言:Python 數據庫:MySQL所用到的知識:Django框架工具:pycharm、Navicat、Maven 系統功能實現 登錄頁面 注冊頁面:用戶賬號,密碼…

05-14 周二 PyTorch動態量化和靜態量化理解

05-14 周二 PyTorch動態量化和靜態量化理解 時間版本修改人描述2024年5月14日10:44:30V0.1宋全恒新建文檔2024年5月14日16:28:16V1.0宋全恒填充了PyTorch對于兩種量化方式的內容 簡介 Pytorch動態量化 設計神經網絡時,可以進行許多權衡。在模型開發和訓練期間&…

Dilworth定理:最少的下降序列個數就等于整個序列最長上升子序列的長度

概念如下&#xff1a; 狄爾沃斯定理_百度百科 (baidu.com) 本質就是找要求序列中最長的單調的子序列&#xff08;不一定連續&#xff09;的長度。 模板如下&#xff1a; 時間復雜度為O&#xff08;N^2&#xff09; #include<iostream>using namespace std;int dp[100…

RK3568平臺開發系列講解(SPI篇)SPI數據的傳輸

??返回專欄總目錄 文章目錄 一、數據結構1.1、spi_transfer 結構體1.2、spi_message二、數據發送程序分析沉淀、分享、成長,讓自己和他人都能有所收獲!?? ?? 參考資料: spi_transferspi_message一、數據結構 spi 數據傳輸主要使用了 spi_message 和 spi_transfer 結構…

二叉樹的前序遍歷(leetcode)

144. 二叉樹的前序遍歷 - 力扣&#xff08;LeetCode&#xff09; 給你二叉樹的根節點 root &#xff0c;返回它節點值的 前序 遍歷。 這道題的啟發性真的很強 &#xff0c;這里必須傳入i的指針進去&#xff0c;下一次棧幀i&#xff0c;但回到了上一層i又變回到了原來的i&#…

docker network ls(用于列出 Docker 主機上的所有網絡)

docker network ls 是一個 Docker 命令&#xff0c;用于列出 Docker 主機上的所有網絡。Docker 允許你創建自定義的網絡&#xff0c;以便更好地控制容器之間的通信。 當你運行 docker network ls 命令時&#xff0c;你可能會看到如下類似的輸出&#xff08;輸出可能會根據你的…

每日一題12:Pandas:數據重塑-融合

一、每日一題 解答&#xff1a; import pandas as pddef meltTable(report: pd.DataFrame) -> pd.DataFrame:reshaped_report report.melt(id_varsproduct, var_namequarter, value_namesales)return reshaped_report 題源&#xff1a;Leetcode 二、總結 melt()函數是Pa…