天天看點

深入了解java虛拟機之——類的加載過程

                                            深入了解JVM之——類加載過程

          在了解類加載之前先了解一下類加載器。顧名思義,類加載器就是将java位元組碼檔案加載到JVM中,在虛拟機中,不同類加載器加載的類一定是不相同的,即使這兩個類是一模一樣的。舉個例子,針對同一個類A,加載器1和加載器2加載A。在虛拟機的世界裡,這兩個加載器加載的“同一個類A”在虛拟機中是不同的,我們需要的是即使是不同的加載器加載同一個類,在虛拟機中也是同一個類,而事實上,虛拟機提供了一種機制來保證不同的類加載器加載同一個類得到的是同一個類對象,這種機制叫做類加載的“雙親委派模型”,如下圖所示,所有的類都會委托給他的父類去加載,當父類加載不了的時候才會自己加載此類,這樣就保證了相同的類都是被同一個類加載器加載,保證了同類的唯一性。從下面圖可以看出,按層次可以劃分為四類:啟動類加載器、擴充類加載器、應用程式類加載器、自定義類加載器。按照虛拟類邏輯劃分,分為兩類:啟動類加載器和其他類加載器。

深入了解java虛拟機之——類的加載過程

    看完了類的加載器,下面進入正題,類的加載過程。先給出JVM類加載器加載類的整個流程圖,下面解釋每一個步驟。

深入了解java虛拟機之——類的加載過程

加載:加載階段是将java源碼編譯後的位元組碼檔案進行加載,這個位元組碼檔案可以是本地的、網絡的、或者其他形式的位元組碼檔案。

驗證:驗證階段主要是對加載的位元組碼檔案進行驗證,看是否符合位元組碼檔案,是否符合java虛拟機的标準,是否對虛拟機産生危害等等,如果上面不符合上述任何一個條件,則驗證不通過,虛拟機加載器不會對其進行加載。

準備:該階段主要為類的變量配置設定記憶體,并初始化為0值,注意這裡僅僅是對類的變量進行記憶體配置設定并指派,而不是執行個體變量的指派。

解析:解析階段是将虛拟機常量池中的引用轉變為直接引用的過程。主要包括:類、接口、方法(類方法,接口方法)、字段的符号引用。

初始化:初始化階段是開始執行程式員java構造代碼。對靜态變量和靜态代碼塊進行初始化。

使用:類的使用

解除安裝:執行類的解除安裝,也就是類的垃圾回收。判斷是否要進行類的解除安裝需要符合下面三種情況,缺一不可。

1.該類所有的執行個體都已經被回收,JVM中不存在任何該類的執行個體。

2.加載該類的類加載器已經被回收。

3.該類的java.lang.Class對象沒有在任何地方被引用。