小結:jvm 類加載過程

在這里插入圖片描述

類加載過程

是Java虛擬機(JVM)將字節碼文件(.class文件)加載到內存中,并轉換為運行時數據結構的過程。這個過程可以分為多個步驟,每個步驟都有其特定的任務和目的。根據你提供的信息,以下是類加載過程的三個主要步驟:

1. 加載

在這個階段,類加載器通過一個類的全限定名來獲取定義此類的二進制字節流。這一步驟包括以下幾個子步驟:

  • 定位字節源:類加載器需要找到包含類定義的字節碼文件。這些字節碼文件可能存在于本地文件系統、網絡資源、數據庫或者其他任何形式的存儲介質中。
  • 讀取字節流:一旦找到了字節碼文件,類加載器會讀取該文件的內容,將其轉化為字節流。
  • 創建類對象:類加載器使用讀取到的字節流來創建一個java.lang.Class對象,這個對象代表了正在被加載的類。

2. 鏈接

鏈接階段的主要任務是將字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。這個階段又可以細分為以下三個子階段:

  • 驗證:確保字節流中的信息符合Java虛擬機規范的要求,不會對虛擬機造成危害。驗證包括字節碼驗證、符號引用驗證等多個方面。
  • 準備:為類的靜態變量分配內存,并設置默認初始值。例如,對于int類型的靜態變量,默認值為0;對于引用類型,默認值為null。
  • 解析:將類的常量池內的符號引用替換為直接引用。符號引用是以字符串形式存在的,而直接引用可以直接指向目標。

3. 初始化

在這里插入圖片描述

在初始化階段,JVM會執行類構造器<clinit>()方法,這個方法是由編譯器自動收集類中的所有類變量的賦值動作和靜態語句塊(static{}塊,中的語句合并產生的。初始化階段是執行類中定義的Java程序代碼(或者說是字節碼)的階段,前面的類加載過程中,除了在加載階段用戶應用程序可以通過自定義類加載器參與之外,其余動作完全由JVM主導和控制。到了初始化階段,才真正開始執行類中編寫的Java程序代碼(或者說是字節碼)。

類加載類型

在這里插入圖片描述

在這里插入圖片描述

1. 類加載器類型

  • Bootstrap Class Loader
    由JVM內部實現(如C++),負責加載核心類庫(如rt.jar)。它是所有類加載器的根基,但沒有對應的Java對象,因此在代碼中不可直接訪問。
  • Extension Class Loader
    加載JRE擴展目錄(如jre/lib/ext)中的類,父加載器為Bootstrap(但通常以null表示)。
  • System/Application Class Loader
    加載應用程序類路徑(-classpath-cp)的類,父加載器是Extension。
  • User-Defined Class Loader
    用戶自定義的類加載器(需繼承ClassLoader類),可靈活指定其父加載器(默認父加載器是System)。

2. 包含關系

  • 不是繼承關系:類加載器之間的層次通過組合實現(每個加載器持有父加載器的引用),而非類的繼承。例如,ClassLoader類中有一個parent字段指向父加載器。
  • 委派模型:加載類時,子加載器會先委派父加載器嘗試加載,父加載器失敗后子加載器才自行加載。這種“雙親委派”機制確保了核心類的安全性。

3. **圖示關系

Bootstrap Class Loader↑(隱含引用)
Extension Class Loader↑(parent字段引用)
System Class Loader↑(parent字段引用)
User-Defined Class Loader(可多個,各自獨立)

Java類加載器之間的關系通過委派模型協作,形成邏輯上的層次結構,但并非通過類繼承實現,而是通過對象間的引用組合(即包含關系)。具體如下:

// System Class Loader 的 parent 是 Extension Class Loader
ClassLoader systemLoader = ClassLoader.getSystemClassLoader();
ClassLoader parent = systemLoader.getParent(); // 父加載器是 Extension

4. Optional的說明

  • Optional可能指Java 9+模塊化系統中的類加載器(如PlatformClassLoader),或特定場景下的可選加載器(如OSGi、Tomcat的WebApp類加載器)。它們與上述加載器協作,但遵循相同的委派邏輯。

總結

類加載器通過委派鏈形成包含關系,每個加載器通過parent字段引用父加載器,而非繼承。這種設計保障了核心類庫的隔離性與安全性,同時允許用戶自定義類加載邏輯。

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

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

相關文章

2024 山東省ccpc省賽

目錄 I&#xff08;簽到&#xff09; 題目簡述&#xff1a; 思路&#xff1a; 代碼&#xff1a; A&#xff08;二分答案&#xff09; 題目簡述&#xff1a; 思路&#xff1a; 代碼&#xff1a; K&#xff08;構造&#xff09; 題目&#xff1a; 思路&#xff1a; 代…

turn.js與 PHP 結合使用來實現 PDF 文件的頁面切換效果

將 Turn.js 與 PHP 結合使用來實現 PDF 文件的頁面切換效果&#xff0c;你需要一個中間步驟將 PDF 轉換為 Turn.js 可以處理的格式&#xff08;如 HTML 頁面或圖片&#xff09;。以下是實現這一功能的步驟和示例代碼&#xff1a; 步驟 1: 安裝必要的庫 首先&#xff0c;你需要…

Python實現NOA星雀優化算法優化卷積神經網絡CNN回歸模型項目實戰

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔視頻講解&#xff09;&#xff0c;如需數據代碼文檔視頻講解可以直接到文章最后關注獲取。 1.項目背景 在當今數據驅動的時代&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;不僅在圖像分類任務中…

(面試)View相關知識

1、View繪制流程 onMeasure() 確定View的測量寬高。onLayout() 確定View的最終寬高和四個頂點的位置。onDraw() 將View 繪制到屏幕上。 2、MeasureSpec有三種測量模式&#xff1a; 2.1. EXACTLY&#xff08;精確模式&#xff09; 含義&#xff1a;父容器明確指定了子View的精…

數組名既可作為指針也可作為變量名

在C語言中&#xff0c;數組名在不同的上下文中既可以作為指向數組首個元素的指針&#xff0c;也可以代表整個數組&#xff0c;這是由C語言的設計和語法規則決定的&#xff0c;下面我來詳細解釋一下。 1. 數組名作為指向首元素的指針 在大多數情況下&#xff0c;當數組名出現在…

Java異常、泛型與集合框架實戰:從基礎到應用

在Java編程的世界里&#xff0c;異常處理、泛型和集合框架是構建高效、健壯應用的關鍵技術。通過掌握這些技術&#xff0c;我們可以更好地管理程序運行時的錯誤&#xff0c;提高代碼的復用性和類型安全性。今天&#xff0c;我將通過一系列實驗&#xff0c;分享如何在Java中使用…

Spring源碼之解決循環依賴 三級緩存

目錄 三級緩存核心原理 循環依賴的解決過程 1. Bean A創建過程中提前曝光工廠 2. Bean B創建時發現依賴A&#xff0c;從緩存獲取 3. Bean A繼續完成初始化 三級緩存的作用總結 二級緩存為何不夠解決緩存依賴&#xff1f; 三級緩存如何解決&#xff1f; 為什么不直接在…

K8S Ingress 實現AB測試、藍綠發布、金絲雀(灰度)發布

假設有如下三個節點的 K8S 集群&#xff1a; ? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、場景分析 閱讀本文&#xff0c;默認您已經安裝了 Ingress Nginx。 1&#xff09;A/B 測試 A/B 測試基于用戶請求的元信息將流量路由…

深入理解構造函數,析構函數

目錄 1.引言 2.構造函數 1.概念 2.特性 3.析構函數 1.概念 2.特性 1.引言 如果一個類中什么都沒有&#xff0c;叫作空類. class A {}; 那么我們這個類中真的是什么都沒有嗎?其實不是,如果我們類當中上面都不寫.編譯器會生成6個默認的成員函數。 默認成員函數:用戶沒有顯…

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接 1 說明2 客戶端配置jdk環境3服務器檢查oracle數據庫補丁4設置ssla 服務器配置walletb 上傳測試腳本和配置文件到客戶端c 服務器修改數據庫偵聽和sqlnet.orad 修改客戶端的sqlnet.ora和tnsnames.ora的連接符e 修改java代碼的數據連接…

BrepGen中的幾何特征組裝與文件保存詳解 deepwiki occwl OCC包裝庫

有這種好東西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 組裝幾何特征以創建B-rep模型 保存為STEP和STL文件細說 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重慶 ICPC 比賽游記

2025.5.9 比賽前一天晚上&#xff0c;激動地睡不著覺&#xff0c;起來收拾了好多東西。&#xff08;其實就四本書&#xff0c;剩下的全是零食……關鍵在于這四本書基本沒用。&#xff09; 2025.5.10 學校喪心病狂的讓我們 6:20 到校門口集合坐車&#xff08;據說是怕趕不上比…

0x08.Redis 支持事務嗎?如何實現?

回答重點 Redis 支持事務,但它的事務與 MySQL 等關系型數據庫的事務有著本質區別。MySQL 中的事務嚴格遵循 ACID 特性,而 Redis 中的事務主要保證的是命令執行的原子性和隔離性,即所有命令在一個不可分割的操作中順序執行,不會被其他客戶端的命令請求所打斷。 最關鍵的區…

佰力博科技與您探討表面電阻的測試方法及應用領域

表面電阻測試是一種用于測量材料表面電阻值的技術&#xff0c;廣泛應用于評估材料的導電性能、靜電防護性能以及絕緣性能。 1、表面電阻的測試測試方法&#xff1a; 表面電阻測試通常采用平行電極法、同心圓電極法和四探針法等方法進行。其中&#xff0c;平行電極法通過在試樣…

數據庫的規范化設計方法---3種范式

第一范式&#xff08;1NF&#xff09;&#xff1a;確保表中的每個字段都是不可分割的基本數據項。 第二范式&#xff08;2NF&#xff09;&#xff1a;在滿足1NF的基礎上&#xff0c;確保非主屬性完全依賴于主鍵。 第三范式&#xff08;3NF&#xff09;&#xff1a;在滿足2NF的基…

產品經理入門(2)產品體驗報告

產品體驗報告大綱&#xff1a;重點在產品體驗——優點。 1.產品概括 可以從各大平臺搜產品介紹。 2.市場分析 按照產品方向分析各個指標——包括有效使用時間,市場規模等。 3. 用戶分析——對用戶通過各項指標畫像。 4.產品體驗——對各項功能與設計的體驗。 5.報告總結

[Java][Leetcode simple] 13. 羅馬數字轉整數

一、自己想的 只有提到的六種情況是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虛擬機上配置靜態 IP 地址并保持重啟后 SSH 連接

在使用 CentOS 7 的虛擬機時&#xff0c;我們通常需要配置靜態 IP 地址&#xff0c;以確保在每次虛擬機重啟后能夠通過 SSH 連接。本文將介紹如何在 CentOS 7 系統中配置靜態 IP 地址&#xff0c;并確保配置在系統重啟后依然生效。 步驟 1&#xff1a;檢查虛擬機網絡接口 首先…

matlab求解問題

一、目的 掌握Matlab中函數求導、函數極值和極限問題的求解,能夠借助Matlab工具對簡單優化模型進行求解。 二、內容與設計思想 1、函數求導 1.1求解給定函數的一階導數&#xff1a;diff(y, x)用于對變量x求y的導數。 1.2求解給定函數的二階導數&#xff1a;在求出一階導數的…

C語言斐波那契數列

斐波那契數列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又稱黃金分割數列 、兔子數列。由意大利數學家萊昂納多?斐波那契在 1202 年提出&#xff0c;源于其《算盤書》中一道兔子繁殖問題。定義&#xff1a;在數學上&#xff0c;該數列以遞歸形式定義。最常見的是…