1. 程式人生 > >《深入理解Java虛擬機器》讀書筆記(JVM常識彙總四)

《深入理解Java虛擬機器》讀書筆記(JVM常識彙總四)

在執行Java程式時候,JVM必須將.class位元組碼檔案載入到記憶體中,才可以例項化這個類。要載入類,就需要用到 類載入器,說道類載入器就要說到  “雙親委派模型”。  此圖來源於 網際網路。

第一層是:BootStrap Classloader是根類載入器,是最高級別的類載入器,它是由JVM啟動時候建立的,負責載入Java中最核心的類(即 jre/lib/rj,jar),比如System,Object,String等。 這個類載入器是由C++ 寫的。

第二層是:Extention ClassLoader 是擴充套件類載入器,在JDK 9以及之後,稱之為 平臺類載入器【Platform classloader】,它負責載入一些擴充套件的類(jre/lib/ext/*.jar),比如XML、加密和壓縮相關的類。

第三層是:Application ClassLoader 是 應用類載入器,主要是用於載入使用者定義的 classpath路徑下的類,一般來說,這個就是預設的類載入器。

那麼什麼是 “雙親委派模型”呢?

如果一個類載入器收到了載入類的請求,它會把這個請求告訴在它上一層的類載入器,每一層的類載入器都要將這個請求向上傳,最終傳到 BootStrap 類載入器,BootStrap如果可以載入,它就自己載入這個類。如果BootStrap說,我自己無法載入這個類,因為它不在我的範圍,它就告訴下一層的類載入器,讓它嘗試著載入,如果它也載入不了,那就繼續丟給下一層的載入器,所以一般來說,應用類載入器就是預設的類載入器。

那麼這個“雙親委派模型”有什麼好處呢?

是為了Java程式的穩定性,試想,如果我們自己定義了一個Object類,那麼在執行的時候。Java程式就會混亂,因為有了雙親委派模型的存在,所以最終 載入的始終是 rt.jar裡的Object。

類載入過程 分為:載入、連結和初始化3個過程。

一、載入:讀取 類檔案,產生此類的二進位制位元組流、將靜態資料結構轉化為執行時資料結構、生成這個類的Class物件(即反射物件)

二、連結 :驗證:是否以魔數  0xCAFEBABE開頭、若不是,證明這個類無法載入或者類檔案損壞。常量、靜態變數是否合理,是否有父類,是否繼承了不被允許繼承的類等等。

連結 :準備:為類變數,即靜態變數分配記憶體,並且設定預設值。

連結 :解析: 解析類和方法,確保類與類之間的相互引用的正確性,完成記憶體結構佈局。

三、初始化

呼叫類構造器 ,<clinit>。為例項賦值。