1. 程式人生 > 實用技巧 >JVM之類載入機制

JVM之類載入機制

前言

Java虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗、解析和初始化,最終形成可以直接被虛擬機器使用的Java型別,這個過程被稱作虛擬機器的類載入機制,類的整個生命週期包括載入、驗證、準備、解析、初始化、使用和解除安裝,其中驗證、準備、解析統稱為連線,如圖所示:

類載入過程

  • 載入

通過類的完全限定名來獲取定義類的二進位制位元組流,在《Java虛擬機器規範》中並沒有明確規定要如何獲取二進位制位元組流,也就是說你可以以任意的方式獲取,比如可以從壓縮包、網路或者利用動態代理生成,然後將位元組流所代表的靜態儲存結構轉換為方法區的執行時資料結構,最後在記憶體中生成一個代表這個類的Class物件。

  • 驗證

該階段是確保位元組流中包含的資訊符合《Java虛擬機器規範》的約束要求,保證這些資訊被當作程式碼執行後不會危害虛擬機器的安全,否則很可能因為載入了有錯誤的或有惡意的位元組碼而導致整個系統崩潰,主要包括檔案格式驗證、元資料驗證、位元組碼驗證、符號引用驗證。

  • 準備

該階段是為類中定義的變數分配記憶體並設定類變數初始值(簡單來說就是i = 5,這裡賦初始值是0,而5將會在初始化階段進行賦值),注意這裡並不包括例項變數。

  • 解析

該階段是虛擬機器將常量池內的符號引用替換為直接引用的過程,其中符號引用指的是一組符號來表示所引用的目標,符號可以是任何形式的字面量,直接引用指的是可以直接指向目標的指標、相對偏移量或者一個能間接定位到目標的控制代碼,主要包括類或介面的解析、欄位解析、方法解析。

  • 初始化

簡單來說就是執行程式程式碼,初始化類變數。

類載入器

該小節就不作過多的描述了,專門找了一篇寫的通俗易懂的文章,結合原始碼闡述了都有哪些類載入器、雙親委派模型的機制、如何自定義類載入器,我就不在費勁去做功課啦,貼上鍊接-類載入器的底層分析

參考連結

《深入Java虛擬機器》

https://blog.csdn.net/javazejian/article/details/73413292