1. 程式人生 > >Java虛擬機器(一)類載入

Java虛擬機器(一)類載入

1、類載入機制

虛擬機器把類的資料從class載入到記憶體,並對資料進行校驗、解析和初始化,最終形成虛擬機器可以直接使用的Java型別,即是虛擬機器的類載入機制。

類載入器並不需要等到某個類被“首次主動使用”時再載入它,JVM規範允許類載入器在預料某個類將要被使用時就預先載入它,如果在預先載入的過程中遇到了.class檔案缺失或存在錯誤,類載入器必須在程式首次主動使用該類時才報告錯誤,如果這個類一直沒有被程式主動使用,那麼類載入器就不會報告錯誤。

載入的類都被快取,快取找不到才會載入。

2、類載入步驟

類載入步驟如下:

1)裝載

通過類的全限定名載入類的位元組流,在記憶體中建立class的物件。

2)連結

驗證:驗證class檔案的位元組流資料,確保不會危害虛擬機器自身安全;

準備:準備操作之後,不帶final靜態變數並沒有賦值,在初始化階段才會賦值;而帶final的靜態變數在此階段就會賦值;

解析:將符號引用解析為直接引用。

3)初始化

成員變數初始化;給類的靜態變數賦值。

3、類載入器

類載入器分為4種:

  • Bootstrap ClassLoader由C++實現,沒有父類。
  • Extension ClassLoader由Java語言實現,父類載入器為null。
  • Application ClassLoader
    由Java語言實現,父類載入器為ExtClassLoader。一般繼承這個類來實現自己的類載入機制;
  • Custom ClassLoader父類載入器肯定為AppClassLoader。

雙親委派機制:除頂層的啟動類載入器以外,其餘的類載入器都有父載入器,這種父子關係並非類繼承關係,而是類組合關係。當類載入器收到載入請求,不會直接載入,而是先委派給父載入器載入,當父載入器載入失敗時,才會嘗試載入。

這種機制的意義在於,避免了類的重複載入。

4、類初始化時機

以下幾種情況,如果類未初始化會對類進行初始化:

  • 建立類的例項;
  • 訪問類的靜態變數或靜態方法;
  • 當初始化一個類時,發現其父類還未初始化,則先出發父類的初始化;
  • 虛擬機器啟動時,定義了main()方法的那個類先初始化;
  • 反射。