JVM 類加載過程

?

?

一、加載(Loading)

目標:把字節碼文件(.class)“讀入 JVM”,生成類的 “半成品”(Class?對象)。

?

  • Bootstrap ClassLoader(啟動類加載器)
    • 負責加載 JVM 核心類庫(如?java.lang?包),用 C++ 實現(不同 JVM 有差異),無對應的 Java 類。
  • Platform ClassLoader(平臺類加載器)
    • 加載 Java 標準庫擴展(如?java.sqljavax?包),JDK 9 后從?Extension ClassLoader?改名而來。
  • App ClassLoader(應用類加載器):??
    • 加載項目自己寫的類、第三方庫(classpath 路徑下的類),是開發中最常用的加載器。

?

類加載器(不同 JDK 版本的差異)

  • 低版本 JDK
    • 啟動類加載器:負責加載rt.jar(包含 Java 核心類庫)中的類。
    • 擴展類加載器:負責加載ext目錄下的擴展類庫中的類。
    • 系統類加載器(System ClassLoader):負責加載classpath中程序員自己編寫的類。
  • 高版本 JDK(9+,引入模塊化思想)
    • 啟動類加載器:仍負責加載 JDK 核心類庫。
    • 平臺類加載器:替代低版本的擴展類加載器,負責加載 Java 平臺擴展的非核心類。
    • 應用類加載器:替代低版本的系統類加載器,負責加載classpath中的類。
    • 變化:rt.jarext目錄消失,類庫被拆分為多個模塊(.jmod文件),不同模塊由不同類加載器加載。

?

流程:類加載器按?雙親委派機制?工作(優先讓父加載器嘗試加載,保證核心類不被篡改),最終找到字節碼文件,讀入內存并生成?Class?對象,存入方法區。

二、鏈接(Linking)

目標:把 “半成品類” 變成可執行的 “成品”,拆成?驗證、準備、解析?三步:

1. 驗證(Verify)

  • 檢查字節碼是否符合 JVM 規范(比如魔數是否是?0xCAFEBABE、語法是否合法),防止惡意 / 錯誤字節碼搞崩 JVM。

2. 準備(Prepare)

  • 給類的靜態變量分配內存 + 設置默認值(比如?static int num = 10,準備階段會先設?num = 0,真正賦值在初始化階段)。
  • 注意:靜態常量(static final)直接賦 “用戶寫的值”(比如?static final int num = 10,準備階段就會設?num = 10?)。

3. 解析(Resolve)

  • 把符號引用替換成直接引用:比如代碼里寫?Object obj = new Object(),編譯后是 “符號引用”(類似 “找名為?Object?的類”),解析階段會換成內存地址(直接引用),讓 JVM 真正能找到對應的類。

三、初始化(Initialization)

目標:執行類的靜態代碼塊、給靜態變量賦 “用戶寫的值”(比如?static int num = 10?在這里真正賦值為?10?)。

?

  • 觸發時機:首次用類的靜態成員、創建對象、反射調用等(遵循?主動使用規則?)。
  • 流程:按代碼順序執行靜態變量賦值、靜態代碼塊,完成后類才算真正 “可用”。

關鍵總結

  1. 類加載器:用 “雙親委派” 保證類加載安全,避免核心類被篡改。
  2. 鏈接階段:驗證字節碼合法性 → 給靜態變量分配內存 → 把符號引用轉成內存地址。
  3. 初始化:執行靜態邏輯,給靜態變量賦最終值,讓類真正 “激活”。

?

?

?

?

類加載器獲取

(1)方式 1:通過當前類的?getClassLoader()?獲取

ClassLoader appClassLoader = ReflectTest.class.getClassLoader();

?

  • 邏輯
    • ReflectTest.class?拿到當前類的?Class?對象,調用?getClassLoader(),獲取 “加載當前類的類加載器”。
    • 因?ReflectTest是項目 classpath 內的自定義類,加載它的就是?應用類加載器
  • 作用:驗證 “自定義類由應用類加載器加載”。

(2)方式 2:通過?ClassLoader.getSystemClassLoader()?獲取

?

ClassLoader appClassLoader2 = ClassLoader.getSystemClassLoader();

?

  • 邏輯
    • ClassLoader?是類加載器基類,靜態方法?getSystemClassLoader()?直接返回?應用類加載器
    • 這是 Java 提供的 “直接獲取應用類加載器” 的標準寫法。
  • 作用:更直接獲取應用類加載器,與方式 1 對比,結果一致。

(3)方式 3:通過線程上下文類加載器獲取

?

ClassLoader appClassLoader3 = Thread.currentThread().getContextClassLoader();
System.out.println("應用類加載器:" + appClassLoader3);

?

?

  • 邏輯
    • 每個 Java 線程默認有 “上下文類加載器(Context ClassLoader)”,默認就是?應用類加載器
    • 通過?Thread.currentThread()?拿到當前線程,調用?getContextClassLoader()?獲取。

?

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

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

相關文章

通俗范疇論13 雞與蛋的故事番外篇

通俗范疇論13 雞與蛋的故事番外篇 在上一篇中,我們得到了雞與蛋的Set局部小范疇如下: 雞與蛋 SetSetSet 局部小范疇 如上圖所示,每個雞來自于一個蛋,每個蛋來自于一只雞,如此循環,以至于無窮… 是的,假設雞與蛋兩個對象代表的集合,都是無窮集合,這個系統就沒有問題…

記錄跟隨recyclerview滑動的指示器

老早之前做的一個功能&#xff0c;橫向recyclerview滑動時&#xff0c;底部做跟隨滑動指示器。今天代碼不用了&#xff0c;記錄下代碼。<LinearLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:layout_marginTop&…

快速過一遍Python基礎語法

前言 本文章是深度學習的前導課&#xff0c;對有編程基礎的小伙伴更加的友好&#xff08;C、C&#xff09;&#xff0c;如果完全沒有學過任何一門編程語言也沒有關系&#xff0c;本文章不會涉及到晦澀難懂的原理&#xff0c;只是簡單的帶大家過一遍Python的基礎語法。 下面的操…

[爬蟲實戰] 多進程/多線程/協程-異步爬取豆瓣Top250

相關爬蟲知識點&#xff1a;[爬蟲知識] 深入理解多進程/多線程/協程的異步邏輯 相關爬蟲專欄&#xff1a;JS逆向爬蟲實戰 爬蟲知識點合集 爬蟲實戰案例 逆向知識點合集 前言&#xff1a; 在之前文章中&#xff0c;我們深入探討了多進程、多線程和協程這三大異步技術的工作…

Git系列--1.初始Git

一、背景 目錄 一、背景 二、認識 三、如何在Linux上安裝Git 3.1檢測git是否存在和版本 3.2安裝和卸載git 3.2.1Centos 3.2.2Ubuntu 四、基本操作 4.1創建本地倉庫 4.2必須的配置項 4.3宏觀認識基本分區 我們會根據需求不斷更改我們的文件內容&#xff0c;但有時我們會…

QWidget的屬性

QWidget的屬性 windowOpacityAPI說明windowOpacity()獲取不透明數值&#xff0c;返回float&#xff0c;取值為0.0到1.0&#xff0c;其中0.0為全透明&#xff0c;1.0為完全不透明setWindowOpacity()設置控件的不透明數值注意點&#xff1a;窗口不透明度的變化并非精確的&#xf…

【PTA數據結構 | C語言版】后綴表達式求值

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;求給定的后綴表達式的值。 輸入格式&#xff1a; 輸入在一行中給出一個非空后綴表達式&#xff0c;其中操作數為 int 型整數&#xff0c;操作符包括加、減、乘、除、取模。各…

裝配式建筑4.0:當房子像汽車一樣被“智造”

傳統建筑方式&#xff0c;如同手工打造藝術品一般&#xff0c;大部分工作依賴現場施工&#xff0c;工人在建筑工地進行混凝土澆筑、磚塊堆砌、鋼筋綁扎等繁雜工作。這種方式受天氣、工人技術水平等因素影響極大&#xff0c;不僅施工周期漫長&#xff0c;質量也參差不齊。據統計…

Go語言生態成熟度分析:為何Go還無法像Java那樣實現注解式框架?

近年來&#xff0c;Go語言因其性能高效、部署簡單、并發模型優秀等特性&#xff0c;成為云原生與微服務架構中的熱門語言。然而&#xff0c;在實際的企業級項目開發中&#xff0c;開發者普遍會發現一個現象&#xff1a;Go的開發效率&#xff0c;尤其在快速構建中大型業務系統時…

oc分類和swift擴展有哪些區別

目錄1. 語言環境2. 主要目的3. 核心能力對比4. 關鍵差異詳解4.1. 屬性支持4.2. Swift 擴展4.3. 初始化器4.4. 方法沖突與覆蓋4.5. 關聯類型與泛型5. 設計哲學6. 總結表在 Objective-C 和 Swift 中&#xff0c;分類&#xff08;Category&#xff09;和擴展&#xff08;Extension…

go.work

一般學習一個小東西時&#xff0c;無非兩點&#xff0c;1、怎么用&#xff1f; 2、為啥用&#xff1f;在寫一個小的項目demo時&#xff0c;忽然看到一個奇怪的東西“go.work”&#xff1f;這是啥&#xff1f;好奇&#x1f62f;&#xff0c;想知道。我是這么問AI的&#xff1a;g…

Kimi K2萬億參數開源模型原理介紹

Kimi K2 技術全解&#xff1a;1T MoE 大模型如何煉成開放智能體 文章目錄Kimi K2 技術全解&#xff1a;1T MoE 大模型如何煉成開放智能體1. 模型架構與特點&#xff1a;1 T MoE 的「大」與「省」2. 主要創新點&#xff1a;MuonClip、Agentic RL 與工具調用2.1 MuonClip 優化器&…

【CMake】CMake構建項目入門

一、CMake介紹 CMake 是一個跨平臺的自動化構建工具&#xff0c;用于管理軟件項目的編譯過程。它通過簡單的配置文件&#xff08;CMakeLists.txt&#xff09;生成特定平臺的構建文件&#xff08;如 Makefile、Visual Studio 項目&#xff09;&#xff0c;讓開發者可以專注于代…

貪心算法題解——劃分字母區間【LeetCode】

763. 劃分字母區間 本題目&#xff0c;“同一字母最多出現在一個片段中”&#xff0c;因為這句話&#xff0c;所以本質上 這道題目屬于合并區間 一、算法邏輯&#xff08;逐步思路&#xff09; ? 目標&#xff1a; 將字符串 s 劃分成盡可能多的片段&#xff0c;要求&#xf…

Python----目標檢測(使用YOLOV8網絡訓練人臉)

一、Ultralytics安裝 網址&#xff1a;主頁 -Ultralytics YOLO 文檔 Ultralytics提供了各種安裝方法&#xff0c;包括pip、conda和Docker。通過 ultralytics pip包安裝最新穩定版本的YOLOv8&#xff0c;或克隆Ultralytics GitHub 存儲庫以獲取最新版本。可以使用Docker在隔離的…

Filament引擎(三) ——引擎渲染流程

通過Filament引擎(二) ——引擎的調用及接口層核心對象的介紹我們知道&#xff0c;要在項目中使用filament&#xff0c;首先我們需要構建出filament的Engine的對象&#xff0c;然后通過filament::Engine對象實例&#xff0c;來構建其他對象&#xff0c;組裝渲染場景&#xff0c…

Oracle存儲過程導出數據到Excel:全面實現方案詳解

技術背景與需求分析 數據導出是企業級應用的核心功能,Oracle存儲過程因其高性能執行(減少網絡傳輸)、代碼復用性(封裝業務邏輯)和事務安全性(ACID保障)成為理想載體。Excel作為使用率$ \geq 95% $的辦公工具,其兼容性需求尤為突出。典型場景包括: 財務報表自動生成物…

解決el-table右下角被擋住部分

一部分展示不全&#xff0c;被遮擋&#xff0c;因為 最右邊加了fixed"right"<el-table-column fixed"right" label"操作" width"120">解決&#xff1a;1、去除fixed"right"或2、設置樣式單頁面<style lang"sc…

Waiting for server response 和 Content Download

在瀏覽器網絡調試&#xff08;如 Chrome DevTools 的 Network 面板&#xff09;中&#xff0c;Timing 選項卡下的 Waiting for server response 和 Content Download 是兩個關鍵性能指標&#xff0c;它們分別代表了 HTTP 請求生命周期的不同階段。以下是詳細解釋和優化方案&…

《Java Web程序設計》實驗報告五 Java Script學習匯報

目 錄 一、實驗目的 二、實驗環境 三、實驗步驟和內容 1、小組成員分工&#xff08;共計4人&#xff09; 2、實驗方案 3、實驗結果與分析 Ⅰ、簡述JavaScript的產生過程與Java的關系 Ⅱ、簡述JavaScript的特點有哪些 Ⅲ、簡述ECMAScript的歷史 Ⅳ、簡述ECMAScript與J…