來聊聊JVM中的類加載過程以及雙親委派模型(學習Java必知內容)

文章目錄

  • 1. 類加載過程
    • 加載
    • 驗證
    • 準備
    • 解析
    • 初始化
  • 2. 雙親委派模型
    • 一個類的加載流程
    • 雙親委派模型的優點
  • 總結


1. 類加載過程

在整個 JVM 執行過程中, 和我們程序員關系最密切的就是類加載的過程, 所以接下來我們來看下類加載的執行流程.

對于一個類來說, 它的生命周期是這樣的:
在這里插入圖片描述

其中前 5 步是固定的順序并且也是類加載的過程, 其中中間的 3 步我們都屬于連接, 所以對于類加載來說總共分為以下幾個步驟:

  1. 加載
  2. 驗證
  3. 準備
  4. 解析
  5. 初始化

類加載, 是一個非常復雜的過程, 此處我們只是簡單介紹一下類加載的大致流程. 細致解析需到 Java 官方文檔進行查閱. 下面我們來看看每個步驟的具體執行內容.

加載

“加載”(Loading)階段指的是整個“類加載”(Class Loading)過程中的一個階段,在加載 Loading 階段,Java虛擬機需要完成以下三件事情:

  1. 通過一個類的全限定名來獲取定義此類的二進制字節流。
  2. 將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。
  3. 在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。

通俗來說, 就是找到 .class 文件, 打開文件, 讀取文件內容, 并嘗試解析里面的格式.

驗證

驗證這一階段的目的是, 確保 .class 文件的字節流中包含的信息符合《Java虛擬機規范》的全部約束要求,保證這些信息被當作代碼運行后不會危害虛擬機自身的安全。

驗證選項:

  • 文件格式驗證
  • 字節碼驗證
  • 符號引用驗證

準備

準備階段是正式為類中定義的變量(即靜態變量,被static修飾的變量)分配內存并設置類變量初始值的階段。最終的目標是構造出完整的類對象。

比如此時有這樣一行代碼:

public static int value = 123;

它在這個階段 value 的 int 值是賦為 0,而非 123。

解析

解析階段是 Java 虛擬機將常量池內的符號引用替換為直接引用的過程,也就是初始化常量的過程。

主要是初始化類中涉及到的一些字符串常量。

初始化

初始化階段,Java 虛擬機真正開始執行類中編寫的 Java 程序代碼,將主導權移交給應用程序。初始化階段就是執行類構造器方法的過程。

也就是這個環節,開始對類對象進行更具體的初始化操作。比如初始化靜態成員,執行靜態代碼塊,加載父類等等。

2. 雙親委派模型

談到類加載機制, 不得不提的一個概念就是 “雙親委派模型”.

雙親委派模型, 可以理解為就是類加載中 JVM 如何去找 .class 文件的一個過程.

JVM 加載 .class 文件時, 會使用到 “類加載器” 模塊, JVM 中自帶了三個類加載器.

在這里插入圖片描述

如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到最頂層的啟動類加載器中,只有當父加載器反饋自己無 法完成這個加載請求(它的搜索范圍中沒有找到所需的類)時,子加載器才會嘗試自己去完成加載。

一個類的加載流程

在這里插入圖片描述

  1. 首先, 會從 Application ClassLoader 開始. 但不會立即就搜索第三方庫的目錄, 而是先把加載任務委派給父類, 讓父類先嘗試加載.
  2. 到了 Extension ClassLoader, 也不會立即就搜索擴展庫的目錄, 也會把加載任務委派給父類, 也讓父類嘗試加載.
  3. 到了 Bootstrap ClassLoader, 也想著把任務委派出去, 可是 Bootstrap ClassLoader 已經沒有父類了, 只能自己動手搜索類了. 如果找到了這個類, 就會進行后續的加載. 如果沒找到這個類, 就會將這個任務交回給子類加載器去完成.
  4. 任務回到了 Extension ClassLoader, 此時收到父類交回的任務后, 就會開始搜索擴展庫的目錄, 看看有沒有匹配的 .class 文件. 如果找到了這個類, 就會進行后續的加載. 如果沒找到這個類, 就會將這個任務交回給子類加載器去完成.
  5. 任務回到 Application ClassLoader, 此時就會開始搜索第三方庫的目錄(往往是自己開發時的項目目錄), 如果找到了這個類, 就會進行后續的加載. 如果沒找到這個類, 這時就會拋出異常.

雙親委派模型的優點

  1. 避免重復加載類:比如 A 類和 B 類都有一個父類 C 類,那么當 A 啟動時就會將 C 類加載起來,那么在 B 類進行加載時就不需要在重復加載 C 類了。
  2. 安全性:使用雙親委派模型也可以保證了 Java 的核心 API 不被篡改,如果沒有使用雙親委派模型,而是每個類加載器加載自己的話就會出現一些問題,比如我們編寫一個稱為 java.lang.Object 類的話,那么程序運行的時候,系統就會出現多個不同的 Object 類,而有些 Object 類又是用戶自己提供的因此安全性就不能得到保證了。

總結

? 本文主要講解了 JVM 中的類加載過程, 以及其中涉及到的雙親委派模型, 是我們學習 Java 過程中, 需要著重了解的.
? 想了解更多知識, 請持續關注博主, 本人會不斷更新學習記錄, 跟隨我一起不斷學習.
? 感謝你們的耐心閱讀, 博主本人也是一名學生, 也還有需要很多學習的東西. 寫這篇文章是以本人所學內容為基礎, 日后也會不斷更新自己的學習記錄, 我們一起努力進步, 變得優秀, 小小菜鳥, 也能有大大夢想, 關注我, 一起學習.

再次感謝你們的閱讀, 你們的鼓勵是我創作的最大動力!!!!!

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

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

相關文章

python pymodbus庫使用教程(以Modbus RTU為例)

文檔: https://pymodbus.readthedocs.io/en/latest/ 源碼: https://github.com/riptideio/pymodbus/ 文章目錄 Python PyModbus庫使用教程:以Modbus RTU為例介紹安裝PyModbus配置串行連接導入必要的模塊創建Modbus客戶端實例 建立連接連接…

UEC++ day8

傷害系統 給敵人創建血條 首先添加一個UI界面用來顯示敵人血條設置背景圖像為黑色半透明 填充顏色 給敵人類添加兩種狀態表示血量與最大血量,添加一個UWidegtComponet組件與UProgressBar組件 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "Enemy …

TikTok歷史探秘:短視頻中的時間之旅

在數字時代的浪潮中,TikTok嶄露頭角,成為社交媒體領域的一顆耀眼新星。這款短視頻應用以其獨特的創意、時尚和娛樂性質,吸引了全球數以億計的用戶。 然而,TikTok并非一夜之間的奇跡,它背后蘊藏著豐富而有趣的歷史故事…

[ChatGPT]ChatGPT免費,不用翻墻!?——你需要的裝備

系列文章目錄 【AIGC】服務于人類|一種新的人工智能技術-CSDN博客 文章目錄 目錄 系列文章目錄 文章目錄 前言 一、天意云網站 ?編輯 二、使用步驟 可以看到有云服務器、Rstudio以及我們的ChatGPT,我這次主要分享ChatGPT,其他的有機會我再給…

常用服務注冊中心與發現(Eurake、zookeeper、Nacos)筆記(一)基礎概念

基礎概念 注冊中心 在服務治理框架中,通常都會構建一個注冊中心,每個服務單元向注冊中心登記自己提供的服務,將主機與端口號、版本號、通信協議等一些附加信息告知注冊中心,注冊中心按照服務名分類組織服務清單,服務…

電力感知邊緣計算網關產品設計方案-軟件架構(業務流程)

軟件架構(業務流程) 基于前端系統提供的硬件通信平臺,后端系統以控制執行單元為核心,協同控制通信管理、驅動適配、存儲單元等職能單元完成與前端系統的通信數據交互業務,在經歷以下業務流程后,完成設備自適應通信業務功能。 1.外部設備通信前端系統 前端系統連接新的…

OpenAI

OpenAI,在美國成立的人工智能研究公司,核心宗旨在于“實現安全的通用人工智能(AGI)”,使其有益于人類。 OpenAI于2015年由一群科技領袖,包括山姆阿爾特曼(Sam Altman)、彼得泰爾(Peter Thiel&a…

設計師不能忽視的幾個寶藏圖標設計工具

在這個快速變化的時代,設計師對創新和實用工具的需求越來越大。這就要求我們及時跟上潮流,不斷探索和嘗試最新、最有價值的圖標設計工具。只有這樣,我們才能在競爭激烈的設計市場中脫穎而出。以下是我們精心挑選的2024年值得一試的圖標設計工…

C語言實現求n以內最大的k個素數c

以下是C語言實現求n以內最大的k個素數的代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <math.h>bool is_prime(int num) { // 判斷素數int i;if(num < 2) {return false;}for(i 2; i < sqrt(num); …

服務器安全如何保障

主機安全是指保護計算機主機&#xff08;也稱為服務器、終端或主機設備&#xff09;免受潛在的安全威脅和攻擊的一系列措施和實踐。主機安全旨在防止未經授權的訪問、數據泄露、惡意軟件感染和其他安全漏洞的利用&#xff0c;主機一旦被黑客入侵&#xff0c;企業會面臨很多安全…

相比其他關系型數據庫,AntDB JDBC驅動特性有哪些不同之處

摘要&#xff1a;使用Java語言進行各類應用程序的快速開發成為目前比較主要且流行的開發方式。JDBC是 Java 語言中用來連接和操作關系型數據庫的 API&#xff0c;在業務程序與關系型數據庫通信時&#xff0c;必然會使用JDBC驅動。 本文將通過國產關系型數據庫AntDB中的JDBC為大…

【Effective C++】 (六) 繼承與面向對象設計

【六】繼承與面向對象設計 條款32 &#xff1a; 確保public繼承是"is a"的關系 Item 32: Make sure public inheritance models “is-a”. C面向對象程序設計中&#xff0c;最重要的規則便是&#xff1a;public繼承應當是"is-a"的關系。當Derived public繼…

3.1.2 Linux時間子系統 hrtimer示例使用

文章目錄 結構體定義接口初始化啟動修改取消示例示例1示例2示例3結構體定義 struct hrtimer {struct timerqueue_node node;ktime_t _softexpires;enum hrtimer_restart

生成目錄結構圖 tree命令

tree /f >info.txt tree命令可用于生成漂亮的目錄結構圖&#xff0c;在此之前&#xff0c;我一直以為是手打的…… .| index.html|\---static---css| bar.css| map.css| \---js

jQuery創建、插入、刪除對象

jQuery庫中的一些操作元素的方法 創建元素&#xff1a; $(htmlString)&#xff1a;這個構造器可以用來創建元素&#xff0c;其中htmlString是一個包含HTML標記的字符串。例如&#xff0c;$(<p>Hello, World!</p>)會創建一個<p>元素對象&#xff1b;$("&…

【uniapp】部分圖標點擊事件無反應

比如&#xff1a;點擊這個圖標在h5都正常&#xff0c;在小程序上無反應 css&#xff1a;也設置z-index&#xff0c;padding 頁面上也試過click.native.stop.prevent"changePassword()" 時而可以時而不行&#xff0c; 最后發現是手機里輸入鍵盤的原因&#xff0c;輸…

大型養殖場需要哪些污水處理設備

大型養殖場是一個涉及環境保護和可持續發展的關鍵行業&#xff0c;對于處理養殖場產生的污水有著明確的要求和標準。為了確保污水得到有效處理和處理效果達到國家排放標準&#xff0c;大型養殖場需要配備一系列污水處理設備。以下是幾種常見的污水處理設備&#xff1a; 1. 水解…

Python入門指南之基本概率和語法基礎

文章目錄 一、基本概念二、控制流三、函數四、模塊五、數據結構六、面向對象的編程七、輸入輸出八、異常九、Python標準庫關于Python技術儲備一、Python所有方向的學習路線二、Python基礎學習視頻三、精品Python學習書籍四、Python工具包項目源碼合集①Python工具包②Python實戰…

快速排序演示和代碼介紹

快速排序的核心是(以升序為例)&#xff1a;在待排序的數據中指定一個數做為基準數&#xff0c;把所有小于基準數的數據放到基準數的左邊&#xff0c;所有大于基準數的數據放在右邊&#xff0c;這樣的話基準數的位置就確定了&#xff0c;然后在兩邊的數據中重復上述操作

2023亞太地區數學建模B題思路分析+模型+代碼+論文

目錄 2023亞太地區數學建模A題思路&#xff1a;開賽后第一時間更新&#xff0c;獲取見文末名片 2023亞太地區數學建模B題思路&#xff1a;開賽后第一時間更新&#xff0c;獲取見文末名片 2023亞太地區數學建模C題思路&#xff1a;開賽后第一時間更新&#xff0c;獲取見文末名…