1. 程式人生 > 程式設計 >Java類載入機制實現流程及原理詳解

Java類載入機制實現流程及原理詳解

前言

  我們知道,Java專案編譯後會生成許許多多的class檔案,class檔案儲存著類的描述資訊。虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗、轉化解析和初始化,最終形成可以被虛擬機器直接使用的Java型別,這就是虛擬機器的類載入機制。

類的生命週期

  類從被載入到虛擬機器記憶體中開始,到卸載出記憶體位置,他的整個生命週期包括:

載入驗證準備解析初始化使用解除安裝

  這七個階段。畫個圖就是下面這樣:

Java類載入機制實現流程及原理詳解

  其中,類載入的過程包括了載入、驗證、準備、解析、初始化這五個階段。其中載入、驗證、準備、初始化順序是固定的,解析可能在初始化之前也可能在初始化之後,為什麼呢?因為Java支援執行時繫結,也就是我們說的多型,所以解析發生的時機不一定。

注意:按順序開始不一定是按順序結束,因為有些階段執行時間較長。

類載入過程

  讓我們看一下類載入過程中,每一階段大概都做了什麼事情!

讓我們看一下類載入過程中,每一階段大概都做了什麼事情!

  • 載入:查詢並載入類的二進位制資料。
  • 連線:
  • 驗證:確保被載入的類的正確性。
  • 檔案格式驗證
  • 元資料驗證
  • 位元組碼驗證
  • 符號引用驗證
  • 準備 為類的靜態變數分配記憶體,並將其初始化為預設值。   
  • 解析:把類中的符號引用轉換為直接引用。
  • 初始化:為類的靜態變數賦予正確得到初始值,JVM負責對類進行初始化,主要對類變數進行初始化。

類載入器四種類載入器

  JVM自帶了三種類載入器,依次為下面前三個,如果有必要,我們還可以加入自定義的類載入器,實現更靈活的載入方式,比如從特定的場所取得java class,例如資料庫中和網路中、動態建立類、自動驗證數字簽名等等。

  • BootStrapClassLoader:啟動類載入器
  • 載入(/JDK/JRE/LIB/ java.)  
  • ExtClassLoader:擴充套件類載入器
  • 載入(/JDK/JRE/LIB/EXT javax.)
  • AppClassLoader:應用類載入器
  • 載入(ClassPath,自己寫的類)
  • *ClassLoader:使用者自定義類載入器

  他們存在層級關係,但是並不是通過繼承實現的,而是通過組合!如下圖:

  Java類載入機制實現流程及原理詳解

雙親委派模型

  如果一個類載入器收到了類載入的請求,它首先不會自己去嘗試載入這個類,而是把請求委託給父載入器去完成,依次向上,因此,所有的類載入請求最終都應該被傳遞到頂層的啟動類載入器中,只有當父載入器在它的搜尋範圍中沒有找到所需的類時,即無法完成該載入,子載入器才會嘗試自己去載入該類。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。