Java 類加載過程

什么是類加載

? ??Java 類加載是指將 Java 字節碼文件加載到 Java 虛擬機(JVM)中,并將其轉化為可以執行的可執行代碼的過程。當 Java 程序在運行時引用某個類時,JVM 會首先檢查是否已經加載該類,如果沒有加載,則會通過類加載器加載該類。

類加載器負責加載字節碼文件(.class 文件)到 JVM 內存中,并生成一個 java.lang.Class 對象,該對象包含了類的所有信息。類加載器主要完成以下三個步驟:

  1. 加載:查找并加載類的字節碼文件。類加載器根據類的名稱來查找字節碼文件,然后將字節碼文件加載到內存中。

  2. 鏈接:將類的字節碼文件鏈接為可執行的代碼。鏈接過程包括驗證、準備(為靜態變量分配內存并設置初始值)、解析(將字節碼中的符號引用轉換為直接引用)等。

  3. 初始化:執行類的初始化代碼,包括靜態變量的初始化和靜態代碼塊的執行。

類加載器采用了雙親委派模型,即先委派給上層的父類加載器進行加載,如果父類加載器無法加載,則由當前類加載器進行加載。這個機制可以確保類的加載是有序的,并且可以避免重復加載同一個類。

雙親委派模型

? ? ??在Java中,類加載器負責將字節碼文件加載到內存中并創建對應的Class對象,從而使得Java程序可以使用這些類。雙親委派模型是Java類加載機制的一種設計模式,它通過層次化的類加載器結構來保證類的唯一性和安全性。

具體來說,雙親委派模型的原理如下:

  1. 當程序需要加載一個類時,首先會委托給最頂層的類加載器——啟動類加載器(Bootstrap Class Loader)。
  2. 啟動類加載器會檢查是否能夠加載該類,如果能夠加載,則直接進行加載;如果不能加載,則將加載請求委托給擴展類加載器(Extension Class Loader)。
  3. 擴展類加載器會檢查是否能夠加載該類,如果能夠加載,則直接進行加載;如果不能加載,則將加載請求委托給應用程序類加載器(Application Class Loader)。
  4. 應用程序類加載器會檢查是否能夠加載該類,如果能夠加載,則直接進行加載;如果不能加載,則拋出ClassNotFoundException異常。

? ? ?這種層次化的委派機制使得每個類加載器只負責加載自己負責的類,而不負責加載其他類。這種分工明確的加載機制可以有效地避免類的重復加載和被惡意篡改的風險。? ? ??

  1. 啟動類加載器(Bootstrap Class Loader)是最頂層的類加載器,它負責加載Java核心類庫,例如java.lang包下的類。
  2. 擴展類加載器(Extension Class Loader)是在啟動類加載器之后,負責加載Java擴展類庫,例如javax包下的類。
  3. 應用程序類加載器(Application Class Loader)是在擴展類加載器之后,負責加載應用程序的類。、
  4. 加載類時的順序是:啟動類加載器 -> 擴展類加載器 -> 應用程序類加載器。

另外,雙親委派模型還有以下幾個特點:

  1. 類加載器之間形成了父子關系,每個類加載器都有一個父加載器。子類加載器會首先委托給父加載器進行加載,只有在父加載器無法加載時,才會嘗試自己加載。
  2. 父加載器通過委派給子加載器,實現了類加載的向上委托機制。這樣可以確保類加載器在加載類時,先從上層類加載器查找,從而保證系統核心庫的安全性。
  3. 雙親委派模型中的類加載器是優先加載父類路徑下的類,這樣可以避免自定義類和Java核心類庫的沖突。

? ? ?雙親委派模型的原理是通過層次化的類加載器結構,自底向上地查找并加載類,從而保證類的唯一性和安全性。這種設計模式在Java中被廣泛應用,能夠有效避免類的重復加載和被篡改的風險,提高了系統的穩定性和安全性。

Java 類加載過程

? ? ?

Java類加載的過程可以分為以下7個步驟:

  1. 加載(Load):加載是類加載過程的第一步。在這一步,Java虛擬機會根據類的全限定名(包括包路徑)查找并加載類的二進制數據,并將其存放在方法區(Java 8之前)或元空間(Java 8及以后)中。類的二進制數據可以來自于多種來源,如本地文件系統、網絡、ZIP壓縮文件等。

  2. 驗證(Verify):驗證是加載過程的第二步。在這一步,Java虛擬機會對類的二進制數據進行合法性校驗,確保其符合Java虛擬機規范。驗證過程包括文件格式驗證、元數據驗證、字節碼驗證和符號引用驗證。

  3. 準備(Prepare):準備是加載過程的第三步。在這一步,Java虛擬機會為類的靜態變量分配內存,并設置默認初始值。靜態變量存放在方法區(Java 8之前)或元空間(Java 8及以后)中。

  4. 解析(Resolve):解析是加載過程的第四步。在這一步,Java虛擬機會將類、接口、字段和方法的符號引用解析為直接引用。符號引用是一種符號化的引用,直接引用是可以直接指向內存中的對象。

  5. 初始化(Initialize):初始化是加載過程的第五步。在這一步,Java虛擬機會對類的靜態變量進行賦值和靜態代碼塊的執行。初始化是類被首次主動使用時觸發的,包括以下情況:創建類的實例、調用類的靜態方法、訪問類的靜態變量、反射調用類的方法和字段,以及初始值為常量的靜態變量(編譯期常量)。

  6. 使用(Use):使用是加載過程的第六步。在這一步,Java虛擬機會根據需要使用類,執行相應的字節碼指令。使用的過程中可以觸發類的初始化。

  7. 卸載(Unload):卸載是加載過程的最后一步。在這一步,Java虛擬機會卸載不再使用的類。類的卸載通常是由Java虛擬機的垃圾回收器判斷并觸發的,判斷標準包括:類的實例被全部回收、類的ClassLoader被回收、類的引用被全部清除。

下面是一個簡單的示例代碼,用于演示類加載過程的幾個階段:

public class MyClass {// 靜態變量public static int count = 0;// 靜態代碼塊static {System.out.println("靜態代碼塊執行");count = 10;}// 靜態方法public static void printCount() {System.out.println("count = " + count);}public static void main(String[] args) {MyClass.printCount();}
}

運行上述代碼,可以看到輸出結果為:

靜態代碼塊執行
count = 10

可以看出,類的加載過程中,靜態代碼塊在準備階段進行賦值,然后在初始化階段執行。

總結?

  1. 加載:在該階段,類的字節碼文件被加載到內存中,并被存儲在方法區中的運行時常量池內。

  2. 驗證:在驗證階段,對字節碼文件的合法性進行檢查,以確保它滿足Java虛擬機的規范要求,并且不會對虛擬機產生安全風險。

  3. 準備:在準備階段,為類的靜態變量分配內存,并設置默認初始值。

  4. 解析:在解析階段,將常量池中的符號引用轉換為直接引用。

  5. 初始化:在初始化階段,對類的靜態變量進行初始化,并執行靜態代碼塊。

  6. 使用:在使用階段,類被加載到內存中,并可以被其他類引用和使用。

  7. 卸載:在卸載階段,當類或類的ClassLoader不再被引用時,類被從內存中卸載。

注意:類的加載過程是按需進行的,即只有在使用到該類時才會觸發加載過程。

??

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

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

相關文章

ue5地編模塊學習記錄

ue5網站功能3d溜溜網下載模型https://anyconv.com/max-to-fbx-converter/3dmax轉換fbx模型解決問題記錄 一、光源 搜索光源搜索不到的時候可以點擊 窗口> 對場景內的光照進行處理

【Java】數組訓練案例

訓練案例1 需求描述: 定義一個含有五個元素的數組,并為每個元素賦值,求數組中所有元素的最小值。 操作步驟描述: 1) 定義5個元素數組。 2) 可以使用初始化數組的兩種方式之一為數組元素賦值。 3&#xff09…

最佳解決Maven同一依賴多版本共存問題,重復依賴(同一個jar包,多個版本)-maven-shade-plugin

先看鏈接:原文鏈接 參照原文鏈接生成的文件(下面是我放的位置) mvn指令 mvn install:install-file -DfileD:\mavenrepository/maven-shade.jar -DgroupIdcom.wj -DartifactIdmaven-shade -Dversion1.1 -Dpackagingjar如果配置了maven_home 和java_home可以任意打開cmd執行(…

Google: 在新知識上微調大語言模型是否會鼓勵產生幻覺?

摘要 當大型語言模型通過監督式微調進行對齊時,它們可能會遇到在預訓練期間沒有獲得的新事實信息。人們經常推測,這可能會教導模型產生事實上不正確的回應的行為,因為模型被訓練成生成沒有基于其預先存在的知識的事實。在這項工作中,Google研究了這種暴露在新知識下對微調后模…

基于springboot實現高校教師電子名片系統項目【項目源碼+論文說明】計算機畢業設計

基于springboot實現高校教師電子名片系統演示 摘要 傳統信息的管理大部分依賴于管理人員的手工登記與管理,然而,隨著近些年信息技術的迅猛發展,讓許多比較老套的信息管理模式進行了更新迭代,名片信息因為其管理內容繁雜&#xff…

C++的數據結構(五):樹和存儲結構及示例

在計算機科學中,樹是一種抽象數據類型(ADT)或是實現這種抽象數據類型的數據結構,用來模擬具有樹狀結構性質的數據集合。這種數據結構以一系列連接的節點來形成樹形結構。在C中,樹的概念和存儲結構是實現各種復雜算法和…

Java--初識類和對象

前言 本篇講解Java類和對象的入門版本。 學習目的: 1.理解什么是類和對象。 2.引入面向對象程序設計的概念 3.學會如何定義類和創建對象。 4.理解this引用。 5.了解構造方法的概念并學會使用 考慮到篇幅過長問題,作者決定分多次發布。 面向對象的引入 J…

Docker之grep: (standard input): binary file matches

使用 docker compose logs -f | grep 命令時遇到了 grep: (standard input): binary file matches 錯誤。 這個錯誤通常發生在 grep 嘗試搜索包含二進制內容的文件時。docker compose logs 命令會輸出容器的日志,而這些日志可能包含二進制數據,導致 gre…

MySQL查詢篇-集合運算

文章目錄 union (并集)union distinctunion all intersect(交集)intersect allintersect distinct except 差集except distinctexcept distinctexcept all union (并集) union distinct 使用前提:a和c數據類型一致&a…

互聯網摸魚日報(2024-05-13)

互聯網摸魚日報(2024-05-13) 36氪新聞 當綠色飛行成為潮流,這家航空公司定下了新目標 | 最前線 回收雨水澆花,廚余垃圾變肥料,我們打卡了阿里北京新園區 | 最前線 本周雙碳大事:中美就氣候問題進行會談;鋰電池行業迎…

GIAT: 蛋白質結構預測的新利器

瑞典Karolinska研究院在瑞典政府贊助下由Ben Murrell等研究團隊在AlphaFold 3最新報告后提出這篇論文提出了一種非常有趣和創新的方法來生成蛋白質骨架結構,稱為生成式不變角度轉換器(GIAT)。與現有的主要基于擴散模型和流匹配的方法不同,GIAT采用了類似于大型語言模型(如GPT)中…

【C語言|數據結構】雙向鏈表

文章目錄 前言1、初步認識雙向鏈表1.1 定義:1.2 結構1.3 節點的存儲 2、雙向鏈表的接口函數2.1 鏈表的節點的動態申請2.2 鏈表的初始化2.3 尾插2.4 頭插2.5 頭刪2.5 尾刪2.6 在pos節點后面添加數據2.6 刪除pos節點 3、雙向鏈表的實現: 前言 各位小伙伴大…

C控制語句:分支和跳轉

1.1if語句 //colddays.c --找出0攝氏度以下的天數占總天數的百分比 #include <stdio.h>int main(void) {const int FREEZING 0;float temperature;int cold_days 0;int all_days 0;printf("Enter the list of daily low temperature.\n");printf("Use…

電子學會C/C++編程等級考試2024年03月(八級)真題解析

C/C編程&#xff08;1~8級&#xff09;全部真題?點這里 第1題&#xff1a;道路 N個以 1 … N 標號的城市通過單向的道路相連:。每條道路包含兩個參數&#xff1a;道路的長度和需要為該路付的通行費&#xff08;以金幣的數目來表示&#xff09; Bob and Alice 過去住在城市 1.在…

藍海創業商機小吃配方項目,日入200+ ,小白可上手,圖文創作轉現快

小吃技術銷售&#xff0c;一單價格從幾元到幾百元不等&#xff0c;行業競爭相對較小&#xff0c;是一個相對冷門的領域。只需一部手機&#xff0c;就可以發布圖文并茂的內容&#xff0c;配上背景音樂&#xff08;BGM&#xff09;&#xff0c;即使是對視頻剪輯不熟悉的新手&…

面試中算法(金礦)

有一位國王擁有5座金礦&#xff0c;每座金礦的黃金儲量不同&#xff0c;需要參與挖掘的工人人數也不同。 例如&#xff0c;有的金礦儲量是5ookg黃金&#xff0c;需要5個工人來挖掘;有的金礦儲量是2ookg黃金&#xff0c;需要3個工人來挖掘...... 如果參與挖礦的工人的總數是10。…

【Oracle impdp導入dmp文件(windows)】

Oracle impdp導入dmp文件&#xff08;windows&#xff09; 1、連接數據庫2、創建與導出的模式相同名稱的用戶WIRELESS2&#xff0c;并賦予權限3、創建directory 的物理目錄f:\radio\dmp&#xff0c;并把.dmp文件放進去4、連接新用戶WIRELESS25、創建表空間的物理目錄F:\radio\t…

試衣不再有界:Tunnel Try-on開啟視頻試衣應用新紀元

論文&#xff1a;https://arxiv.org/pdf/2404.17571 主頁&#xff1a;https://mengtingchen.github.io/tunnel-try-on-page/ 一、摘要總結 隨著虛擬試衣技術的發展&#xff0c;消費者和時尚行業對于能夠在視頻中實現高質量虛擬試衣的需求日益增長。這項技術允許用戶在不實際穿…

目標檢測——印度車輛數據集

引言 親愛的讀者們&#xff0c;您是否在尋找某個特定的數據集&#xff0c;用于研究或項目實踐&#xff1f;歡迎您在評論區留言&#xff0c;或者通過公眾號私信告訴我&#xff0c;您想要的數據集的類型主題。小編會竭盡全力為您尋找&#xff0c;并在找到后第一時間與您分享。 …

弱監督語義分割學習筆記

目錄 partial cross entropy loss GitHub - LiheYoung/UniMatch: [CVPR 2023] Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation partial cross entropy loss import torch import torch.nn.functional as Fdef partial_cross_entropy_loss…