JVM 類加載過程筆記

一、概述

JVM(Java Virtual Machine)在運行 Java 程序時,需要將 .class 字節碼文件加載到內存中,并轉換成可以被 JVM 執行的數據結構,這一過程就是 類加載過程(Class Loading Process)

JVM 的類加載機制具備高度靈活性與可擴展性,支持自定義類加載器,且類的生命周期分為以下幾個階段:

二、類的生命周期階段

  1. 加載(Loading)
  2. 驗證(Verification)
  3. 準備(Preparation)
  4. 解析(Resolution)
  5. 初始化(Initialization)
  6. (可選)使用(Using)
  7. (可選)卸載(Unloading)

前五個階段屬于 類加載的過程,使用和卸載屬于類的生命周期的后期階段。


三、類加載的五個階段詳解

1. 加載(Loading)

作用:
.class 文件的字節碼從磁盤或網絡加載到 JVM 內存中,并生成一個 Class 對象。

步驟:

  • 通過類的全限定名查找 .class 文件。
  • 讀取字節流。
  • 將字節流轉換成內存中的數據結構。
  • 創建 java.lang.Class 類的實例。

說明:

  • 使用 類加載器(ClassLoader) 完成。
  • 可以自定義類加載器實現特殊的加載邏輯。

2. 驗證(Verification)

作用:
確保字節碼文件的正確性與安全性,不會破壞 JVM 的穩定性。

主要檢查:

  • 文件格式驗證(魔數、版本號等)
  • 元數據驗證(類結構正確性)
  • 字節碼驗證(操作碼合法性、棧操作正確性)
  • 符號引用驗證(類和方法是否存在)

3. 準備(Preparation)

作用:
為類的 靜態變量 分配內存,并初始化默認值(不包括靜態代碼塊和顯式賦值)。

特點:

  • 所有靜態變量初始化為零值(數值為0,對象為null,boolean為false)。
  • 不執行任何 Java 代碼。
  • 這一步只是內存分配與默認值初始化。

示例:

public class Demo {static int a = 10;
}

在準備階段,a 的值是 0,真正賦值為 10 的過程發生在 初始化階段


4. 解析(Resolution)

作用:
將常量池中的 符號引用 轉換為 直接引用

解析內容:

  • 類或接口的符號引用 → 直接引用
  • 字段符號引用 → 直接引用
  • 方法符號引用 → 直接引用
  • 接口方法引用 → 直接引用

說明:

  • 并非必須立即解析,可在運行時動態解析(延遲解析)。
  • 也可由 JVM 實現決定是否在加載時解析。

5. 初始化(Initialization)

作用:
執行類構造器 <clinit>() 方法,對靜態變量進行顯式賦值和執行靜態代碼塊。

執行條件:

  • 創建類的實例
  • 訪問類的靜態變量或靜態方法
  • 反射調用 Class.forName()
  • 初始化類的子類時,其父類會被先初始化
  • JVM 啟動時指定的主類(含 main 方法)

注意:

  • 每個類只會初始化一次。
  • 父類先于子類初始化。

四、類加載器(ClassLoader)

類加載器的類型

名稱說明
Bootstrap ClassLoader(啟動類加載器)加載 java.* 核心類庫(由 C++ 實現,非 Java 類)
Extension ClassLoader(擴展類加載器)加載 ext 目錄下的類(如 jre/lib/ext
Application ClassLoader(系統類加載器)加載應用類路徑(classpath)下的類
自定義類加載器用戶可以繼承 ClassLoader 實現自己的加載邏輯

雙親委派模型(Parent Delegation Model)

工作流程:

  1. 當前類加載器收到加載請求。
  2. 委派給父類加載器。
  3. 父類加載器繼續向上委托,直到 Bootstrap ClassLoader。
  4. 若父加載器無法加載,再由當前加載器嘗試加載。

優點:

  • 避免類的重復加載。
  • 保證核心類安全性(如 java.lang.String 永遠由啟動類加載器加載)。

五、類的卸載(Unloading)

條件:

  • 該類的 Class 對象沒有任何引用。
  • 加載該類的類加載器沒有任何引用。
  • JVM 才能卸載該類。

說明:

  • 卸載的前提是類加載器無引用,通常發生在動態部署的模塊或插件系統中。
  • 主動卸載需要結合自定義類加載器。

六、類加載過程圖解

              ┌────────────┐│ .class 文件 │└────┬───────┘↓┌────────────┐│ 加載 Loading│└────┬───────┘↓┌───────────────────┐│ 驗證 Verification │└────┬──────────────┘↓┌────────────────┐│ 準備 Preparation│└────┬───────────┘↓┌──────────────┐│ 解析 Resolution│└────┬─────────┘↓┌─────────────────────┐│ 初始化 Initialization│└─────────────────────┘

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

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

相關文章

基于爬蟲技術的電影數據可視化系統 Python+Django+Vue.js

本文項目編號 25002 &#xff0c;文末自助獲取源碼 \color{red}{25002&#xff0c;文末自助獲取源碼} 25002&#xff0c;文末自助獲取源碼 目錄 一、系統介紹二、系統錄屏三、啟動教程四、功能截圖五、文案資料5.1 選題背景5.2 國內外研究現狀 六、核心代碼6.1 查詢數據6.2 新…

如何用 LUKS 和 cryptsetup 為 Linux 配置加密

在信息安全愈發重要的今天&#xff0c;為 Linux 系統盤配置全盤加密已經成為很多企業和個人的選擇。LUKS&#xff08;Linux Unified Key Setup&#xff09;配合工具 cryptsetup 可以在不犧牲性能的前提下實現高強度加密。本文將通過一個故事化的場景&#xff0c;介紹整個配置過…

VIVADO技巧_BUFGMUX時序優化

1.版本說明日期作者版本說明2025xxxx風釋雪初始版本 2.概述 基于VIVADO時序約束&#xff0c;BUFGMUX多路時鐘選擇原語的設計3.原語介紹 7系列FPGA/UltraSCale/UltraSCaleBUFGMUX_CTRL BUFGMUX_CTRL_inst (.O(O), // 1-bit output: Clock output.I0(I0), // 1-bit input: Cloc…

服務器系統時間不準確怎么辦?

服務器系統時間不準確可能會導致日志錯亂、任務調度失敗、SSL證書校驗錯誤等問題。以下是解決辦法&#xff1a;&#x1f310; 一、同步系統時間的方法1. 使用 timedatectl 命令&#xff08;適用于 systemd 系統&#xff09;timedatectl set-ntp true # 開啟自動同步 timedatect…

零信任產品聯合寧盾泛終端網絡準入,打造隨需而變、精準貼合業務的網絡安全訪問體系

零信任網絡訪問控制&#xff08;Zero Trust Network Access&#xff0c;ZTNA&#xff0c;文中零信任皆指 ZTNA&#xff09;基于“永不信任&#xff0c;持續驗證”的理念&#xff0c;打破了企業基于傳統網絡邊界進行防護的固有模式。在當前日趨復雜的網絡環境下&#xff0c;內部…

【未限制消息消費導致數據庫CPU告警問題排查及解決方案】

一、背景 某天下午&#xff0c;上游系統同一時間突然下了三個大合同數據&#xff0c;平均每個合同數據實例在6萬以上的量級&#xff0c;短短幾分鐘內瞬間有20萬左右的流量涌入系統。 而在正常情況下&#xff0c;系統1天處理的流量也不過2千量級&#xff0c;當時數據庫指標監控告…

iOS開發 Swift 速記2:三種集合類型 Array Set Dictionary

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的&#xff0c;可以在任何平臺上使用。 源碼指引&#xff1a;github源…

Apache基礎配置

一、Apache安裝# 安裝apache [rootwebserver ~]# yum install httpd -y# 在防火墻中放行web服務 [rootwebserver ~]# firewall-cmd --permanent --add-servicehttp success [rootwebserver ~]# firewall-cmd --permanent --add-servicehttps success# 開啟服務 [rootwebserver …

Python100個庫分享第37個—BeautifulSoup(爬蟲篇)

目錄專欄導讀&#x1f4da; 庫簡介&#x1f3af; 主要特點&#x1f6e0;? 安裝方法&#x1f680; 快速入門基本使用流程解析器選擇&#x1f50d; 核心功能詳解1. 基本查找方法find() 和 find_all()CSS選擇器2. 屬性操作3. 文本提取&#x1f577;? 實戰爬蟲案例案例1&#xff…

石子入水波紋效果:頂點擾動著色器實現

水面波紋的真實模擬是計算機圖形學中一個經典且重要的課題,廣泛應用于游戲、影視和虛擬現實等領域。本文將從技術原理和實現細節出發,系統介紹如何利用**頂點擾動(Vertex Displacement)**技術,結合多種輔助方法,打造既真實又高效的水面波紋效果。 一、頂點擾動的核心思想…

【FFmpeg 快速入門】本地播放器 項目

目錄 &#x1f308;前言&#x1f308; &#x1f4c1; 整體架構 詳細流程 &#x1f4c1; 數據流向? &#x1f4c1; 隊列設計?編輯 &#x1f4c1; 線程設計 &#x1f4c1; 音視頻同步 &#x1f4c1; 音頻輸出設計 &#x1f4c1; 視頻輸出設計 &#x1f4c1; 總結 …

Maven dependencyManagement標簽 properties標簽

dependencyManagement標簽properties標簽

前端埋坑之element Ui 組件el-progress display:flex后不顯示進度條解決方案

項目適用場景&#xff1a; <divs style"display&#xff1a;flex"> <span>這里是進度條前標題說明</span> <el-progress :percentage"50"></el-progress> </div> 問題呈現&#xff1a; el-progress進度條沒啦&#xf…

嵌入式學習-土堆PyTorch(7)-day23

損失函數的調用import torch from torch import nn from torch.nn import L1Lossinputs torch.tensor([1.0,2.0,3.0]) target torch.tensor([1.0,2.0,5.0])inputs torch.reshape(inputs, (1, 1, 1, 3)) target torch.reshape(target, (1, 1, 1, 3)) #損失函數 loss L1Loss…

【2025最新】使用neo4j實現GraphRAG所需的向量檢索

學習筆記&#xff0c;比較混亂&#xff0c;介意慎點。 背景 在將UMLS或者LightRAG構造的數據庫存入neo4j之后&#xff0c;我開始將知識圖譜運用到實際場景的使用中、例如查詢、推理。然而&#xff0c;由于字符串匹配導致大量術語在檢索時出現缺失。導致檢索效果不佳。我們需要…

【AI深究】隨機森林(Random Forest)全網最詳細全流程詳解與案例(附Python代碼演示)|集成學習|數學原理、案例流程、代碼演示及結果解讀|參數與調優、工程啟示、單棵決策樹的對比、優缺點

大家好&#xff0c;我是愛醬。本篇將會系統地講解隨機森林&#xff08;Random Forest&#xff09;的原理、核心思想、數學表達、算法流程、代碼實現與工程應用。內容適合初學者和進階讀者&#xff0c;配合公式和可視化示例。 注&#xff1a;本文章含大量數學算式、詳細例子說明…

6.String、StringBuffer、StringBuilder區別及使用場景

String固定長度&#xff0c;引用的字符串內容無法改變例如&#xff0c;String s abc;s def;那么 s 字符串對應的地址已經改變了StringBuider 聲明一個對象時&#xff0c;指向堆中的一塊空間&#xff0c;包括兩個屬性 value 和 count其中 value 屬性類似動態數組&#xff0c;可…

Qualcomm Linux 藍牙指南學習--驗證 Fluoride 協議棧的功能(2)

前言 Qualcomm Technologies推出的Linux藍牙指南詳細介紹了基于Qualcomm RB3 Gen 2和IQ-9100 Beta開發套件的藍牙解決方案。該文檔涵蓋BlueZ和Fluoride協議棧的功能驗證流程,支持藍牙5.2核心規范,包括WCN6750/WCN6856/QCA6698AQ芯片組的特性。主要內容分為三部分: ?1. 功…

Spring Boot中REST與gRPC并存架構設計與性能優化實踐指南

Spring Boot中REST與gRPC并存架構設計與性能優化實踐指南 在微服務架構日益復雜的當下&#xff0c;單一協議往往難以滿足高并發低延遲與生態兼容的雙重需求。本文基于真實生產環境的項目經驗&#xff0c;分享了如何在Spring Boot中同時提供RESTful API和gRPC接口的架構設計、性…