????????Java類加載過程包括加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)五個階段。這些階段是按照順序逐步執行的。
-
加載(Loading):
- 類加載的第一階段是加載,它的目標是查找并加載類的字節碼文件。
- 類加載器根據類的全限定名來定位類文件,加載器可以是啟動類加載器、擴展類加載器、應用程序類加載器,或者是用戶自定義的類加載器。
- 加載完成后,系統會在內存中生成一個代表這個類的?
Class
?對象。
-
驗證(Verification):
- 在驗證階段,虛擬機對加載的字節碼進行驗證,確保其符合Java語言規范和虛擬機規范的要求。
- 驗證的目標包括類文件格式的驗證、元數據的驗證、字節碼的驗證、符號引用的驗證等。
-
準備(Preparation):
- 在準備階段,虛擬機為類的靜態變量分配內存并設置初始值,這些變量被稱為“靜態變量的內存分配”。
- 這里所說的初始值通常是數據類型的零值(如0、false、null等),而不是程序中所定義的初始值。
-
解析(Resolution):
- 解析階段是將常量池中的符號引用替換為直接引用的過程。解析動作主要針對類或接口、字段、類方法、接口方法、方法句柄和方法類型這幾類符號引用進行。
- 解析可以在類加載的任何時候觸發,也可以選擇在運行期間某個階段觸發。
-
初始化(Initialization):
- 在初始化階段,虛擬機執行類的初始化方法?
<clinit>
(類構造器),該方法是由編譯器自動收集類中的所有類變量的賦值動作和靜態語句塊合并產生的。 - 初始化階段是類加載的最后一步,它是真正執行類中定義的Java程序代碼的階段。
- 如果一個類具有父類,JVM會保證在子類初始化之前,父類已經被初始化了。
- 在初始化階段,虛擬機執行類的初始化方法?
類的生命周期
類的生命周期是在加載類之后進行使用再卸載。
-
使用(Usage):
- 在初始化完成后,類就進入了可使用狀態。在這個階段,可以創建類的實例,調用類的方法,訪問類的字段等。
-
卸載(Unloading):
- 類的生命周期最后一個階段是卸載。在這個階段,類被從內存中移除,釋放相應的資源。類卸載通常發生在類加載器被回收時,而類加載器的回收則需要滿足一定的條件,例如該類的所有實例都已經被回收,而且沒有任何地方引用該類。
總結
????????這五個階段共同構成了Java類加載的過程。需要注意的是,類加載過程是動態的,可以在運行時通過反射等機制動態加載類。