Java虛擬機(三)——類加載機制

虛擬機類加載機制

類加載時機

​ 類從被加載到虛擬機內存開始到卸載內存爲止,整個生命週期包括:加載、驗證、準備、解析、初始化、使用和卸載java

​ 類必須當即初始化狀況:安全

  1. 遇到 new、getstatic、putstatic和invokestatic這4條字節碼指令時。
  2. 使用java.lang.reflect包方法對類進行反射調用時候。
  3. 當初始化一個類的時候,欺父類沒有被初始化要先初始化其父類。
  4. 虛擬機啓動時用戶須要指定要執行的主類(包括main方法),虛擬機會先初始化這個主類。
  5. 若是一個java.lang.reflect.MethodHandle實例最後的解析結果是REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,而且這個方法句柄所對應的類沒有初始化,則先觸發其初始化。

類加載過程

加載
  1. 經過一個類的全限定名獲取此類的二進制字節流。
  2. 將這個字節流所表明的的靜態存儲結構轉換成方法區的運行時數據結構。
  3. 在內存生成一個表明這個類的java.lang.Class對象,做爲方法區這個類的各類數據的訪問接口。
驗證

​ 是鏈接階段的第一步,這個階段的目的是爲了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,並不會危害虛擬機的自身安全。數據結構

  • 文件格式驗證指針

    第一階段驗證字節流是否符合Class文件格式規範,並能被當前版本虛擬機處理。cdn

  • 雲數據驗證對象

    第二階段對字節碼描述的信息進行語義分析,確保描述信息符合Java語言要求規範。blog

  • 字節碼驗證接口

    第三階段對類的方法體進行校驗分析,保證被校驗的方法在運行時不會出現危害虛擬機的安全事件。生命週期

  • 符號引用驗證事件

    對類自身之外(常量池中的各類符號引用)的信息進行匹配校驗。

準備

​ 正式爲變量分配內存並設置初始值的階段,這些變量使用的內存將在方法區中分配。僅包括類變量(被static修飾)不包括實例變量。賦初值是指數據類型的零值。

解析

​ 將常量池中的符號引用替換爲直接引用。

  • 符號引用:以一組符號來描述所引用的目標,符號能夠是任何形式的字面量。
  • 直接引用:能夠直接指向目標的指針、相對偏移量或能間接的定位到目標的句柄。
初始化

執行類中定義的Java程序代碼,初始化階段是執行類構造器(<clinit>())方法的過程。

類加載器

啓動類加載器、擴展類加載器、應用程序類加載器。

雙親委派模型

雙親委派模型

雙親委派模型要求除了頂層的啓動類加載器外,其他的類加載器都應當有本身的父類加載器。這裏的類加載器的父子關係通常是組合關係來複用父加載器的代碼。

​ 工做過程:若是一個類加載器收到類加載請求,首先會把這個請求爲派給父類加載器去完成,每一層的類加載器都是這樣的,所以全部請求都傳給頂層的啓動類加載器,只有當父類加載器反饋沒法完成加載請求,子類纔會嘗試本身加載。

歡迎掃碼關注我 😊

image
相關文章
相關標籤/搜索