Java-JVM複習01-類加載機制

1. JVM 結構

在這裏插入圖片描述

2. JVM 類加載過程

在這裏插入圖片描述

  • 加載
  1. 獲取類的二進制字節流
  2. 將字節流的靜態存儲結構轉化爲方法區的運行時數據結構
  3. 在內存中生成java.lang.Class對象,作爲這個類的訪問入口

連接

  • 驗證:確保加載的字節流信息符合虛擬機要求
  1. 驗證文件格式、元數據、字節碼、符號引用
  • 準備:在方法區中爲基本類型變量分配內存空間
  1. 根據基本變量類型,設置其對應的默認初始值
  2. 顯示初始化被final修飾的變量(final變量在編譯階段時已被分配)
  • 解析:將常量池中的符號引用替換爲直接引用的過程
  1. 符號引用就是用符號描述所引用的目標,符號規範明確定義在Java虛擬機規範
  2. 直接引用可以是指向目標的指針、相對偏移量、能間接定位到目標的句柄

  • 初始化:執行類構造器 <clinit>() 的過程
  1. <clinit>()方法是根據類中的靜態變量賦值動作和靜態代碼塊語句自動定義的
  2. 若該類存在父類,JVM保證優先執行父類的<clinit>()

3. 類加載器

在這裏插入圖片描述

  • 啓動類加載器(由C++編寫):負責加載 JAVA_HOME\lib 目錄中的類
  • 擴展類加載器:負責加載 JAVA_HOME\lib\ext 目錄中的類
  • 應用程序類加載器:負責加載用戶路徑,即 classpath 上的類
  • 用戶自定義加載器:繼承ClassLoader重寫findClass()方法,需求不復雜時直接繼承URLClassLoader

4. 雙親委派機制

在這裏插入圖片描述

當一個類收到了類加載請求,他首先不會嘗試自己去加載這個類,而是把這個請求委派給父類去完成,每一個層次類加載器都是如此,因此所有的加載請求都應該傳送到啓動類加載其中,只有當父類加載器反饋自己無法完成這個請求的時候(在它的加載路徑下沒有找到所需加載的Class),子類加載器纔會嘗試自己去加載

優勢:

  1. 保護程序安全,防止核心API被惡意篡改(沙箱安全機制)
  2. 避免類的重複加載