1. 程式人生 > >深入理解java虛擬機器---4虛擬機器類載入機制

深入理解java虛擬機器---4虛擬機器類載入機制

類載入的整個生命週期:

   載入、連線(驗證、準備、解析)、初始化、使用、解除安裝。

載入:

     class檔案中的二進位制資料讀取到記憶體中,然後將該位元組流所代表的靜態資料結構轉化為方法區中執行的資料結構,並且在堆記憶體中生成一個java.lang.Class物件作為訪問方法區資料結構的入口

驗證:

  確保當前class檔案的位元組流所包含的內容符合當前JVM的規範要求,並且不會出現危害JVM自身安全的程式碼,當前位元組流不符合規範會丟擲VerifyError的異常,或者子異常,驗證的資訊有:

(1)檔案格式:驗證二進位制檔案是什麼型別,驗證是否符合當前JVM規範。

(2)元資料驗證:檢查類是否有父類、介面,驗證其父類、介面的合法性,    驗證被final修飾的類,  驗證是否是抽象類,是否實現了父類的抽象方法或者介面中的方法,   驗證方法的過載。

(3)位元組碼驗證,主要驗證程式的控制流程比如迴圈、分支等。

(4)符號驗證,主要驗證符號引用轉換為直接引用時的合法性。

準備:

  當一個Class檔案的位元組流通過驗證,就開始為該物件的類變數,也就是靜態變數,分配記憶體和初始值,各種資料型別的初始值基本都是0值,被final修飾則為指定值。

解析:

  所謂解析就是指在常量池中找到類、介面、方法、欄位的符號引用,並將其替換為直接引用的過程。

初始化:

  執行<clinit>()方法(clinit是class initialize的簡寫),<clinit>()方法再編譯過程中生成,此方法中包含了所有類變數的賦值以及靜態程式碼語句塊的執行程式碼,編譯器收集的順序是由執行語句在原始檔中的出現順序來決定的,靜態語句塊只能對後面的靜態變數進行賦值,而不能對其進行訪問

 

使用、解除安裝:

  顧名思義,就是使用跟解除安裝。

雙親委派機制:

  兩種類載入器:

1、 啟動類載入器(由C++實現,是虛擬機器自身的一部分)(lib目錄下的)

2、其他類載入器(由java語言實現,獨立於虛擬機器外,並且全部繼承抽象類ClassLoader),包括:擴充套件類載入器(lib/ext目錄下的)、應用程式類載入器(classPath上的類庫)、自定義載入器。

  除了頂層的啟動類載入器,其他類載入器都必須要有自己的父類載入器,這種是以組合方式來複用父載入器的程式碼。

  工作過程:類載入——>嘗試父類載入parent.loadClass——>成功則載入完成,失敗則自己載入findClass