Java虛擬機器(一)類載入
阿新 • • 發佈:2019-01-02
1、類載入機制
虛擬機器把類的資料從class載入到記憶體,並對資料進行校驗、解析和初始化,最終形成虛擬機器可以直接使用的Java型別,即是虛擬機器的類載入機制。
類載入器並不需要等到某個類被“首次主動使用”時再載入它,JVM規範允許類載入器在預料某個類將要被使用時就預先載入它,如果在預先載入的過程中遇到了.class檔案缺失或存在錯誤,類載入器必須在程式首次主動使用該類時才報告錯誤,如果這個類一直沒有被程式主動使用,那麼類載入器就不會報告錯誤。
載入的類都被快取,快取找不到才會載入。
2、類載入步驟
類載入步驟如下:
1)裝載
通過類的全限定名載入類的位元組流,在記憶體中建立class的物件。
2)連結
驗證:驗證class檔案的位元組流資料,確保不會危害虛擬機器自身安全;
準備:準備操作之後,不帶final靜態變數並沒有賦值,在初始化階段才會賦值;而帶final的靜態變數在此階段就會賦值;
解析:將符號引用解析為直接引用。
3)初始化
成員變數初始化;給類的靜態變數賦值。
3、類載入器
類載入器分為4種:
- Bootstrap ClassLoader:由C++實現,沒有父類。
- Extension ClassLoader:由Java語言實現,父類載入器為null。
- Application ClassLoader
- Custom ClassLoader:父類載入器肯定為AppClassLoader。
雙親委派機制:除頂層的啟動類載入器以外,其餘的類載入器都有父載入器,這種父子關係並非類繼承關係,而是類組合關係。當類載入器收到載入請求,不會直接載入,而是先委派給父載入器載入,當父載入器載入失敗時,才會嘗試載入。
這種機制的意義在於,避免了類的重複載入。
4、類初始化時機
以下幾種情況,如果類未初始化會對類進行初始化:
- 建立類的例項;
- 訪問類的靜態變數或靜態方法;
- 當初始化一個類時,發現其父類還未初始化,則先出發父類的初始化;
- 虛擬機器啟動時,定義了main()方法的那個類先初始化;
- 反射。