JVM-part1-類載入子系統組成,及流程

just1t發表於2024-04-21

類載入子系統的作用:

將所需要的Class檔案進行載入,載入流程存在一下幾個階段:

  1. 第一個階段為載入階段(Loading階段):這個階段是將引導類載入器和非引導類載入器需要載入的Class檔案進行載入。
    具體來說:
  • 引導類載入器(BootStrapClassLoader):這個載入器的作用是將java_home/jre/lib下的Class檔案進行載入,它是由C、C++語言編寫的,透過getClassLoader().parent()的方式進行獲取的結果為null
  • 非引導類載入器:也就是透過Java程式碼編寫的類載入器(繼承java.lang.ClassLoader),它有三部分:
    • 擴充套件類載入器(Extension ClassLoader):這是引導類載入器之後的第二優先順序的載入器,通常負責載入Java的擴充套件庫,也就是位於JDK的jre/lib/ext目錄下或者由系統變數java.ext.dirs指定的路徑下的類或包。
    • 應用類載入器(Application ClassLoader):也稱為系統類載入器,這是ClassLoader層次結構中的第三級,它負責載入CLASSPATH上指定的類庫。它是Java應用程式預設使用的類載入器。
    • 使用者自定義類載入器(Custom ClassLoader):使用者可以建立自己的類載入器,這些類載入器一般繼承自ClassLoader類或其子類,以實現特殊的類載入邏輯,比如從特定的儲存介質(網路、加密檔案等)載入類和資源。

(注意哈,它們之間的關係是層級關係,類似於資料夾,引導>擴充>引用>自定義)

說到類載入器就涉及到了雙親委派機制:
什麼是雙親委派機制:簡單來說就是在載入一個Class檔案的時候都會尋找上級,看上級是否能載入這個Class檔案,如果所有的上級都不行,才輪到自己載入

為什麼要使用這種機制:使用這種機制就可以解決類重複載入問題,也可以為Java的核心類如String呀起一個保護作用

2.第二個階段為連線階段(Linking階段):Linking階段分為三個階段,分別為

  • 校驗階段(Verify):他的作用是確保載入的Class檔案是合法的,是否符合Java虛擬機器的規劃要求,具體分為
    • 格式校驗:驗證Class檔案結構是否正確,例如位元組碼檔案是不是以CAFEBABE開頭等
    • 安全校驗:驗證Class檔案是否對虛擬機器產生危害等等
      ...
  • 準備階段(Perpare):這個階段的作用是為類中的類變數(靜態變數)在方法區(元空間)分配記憶體並賦預設值,這裡需要注意,如果是static修飾並且用final修飾的變數會在分配了記憶體之後直接賦值(因為final修飾的變數不能進行修改,所以就在分配記憶體之後就進行賦值)
  • 解析階段(Resolve):它的主要作用是將常量池(Constant Pool)中的符號引用轉化為直接引用(記憶體地址),這裡可以透過javap -v xxx.class 檔案將class檔案轉化為位元組碼之後進行觀察Constant Pool部分。

3.第三個階段為初始化階段(Initialization階段):將準備階段中的靜態變數進行賦值,執行靜態程式碼塊(執行clinit部分)

相關文章