跟我一起學JVM(六)——類的加載機制

類的生命週期
加載-驗證-準備-解析-初始化-使用-卸載

類的初始化階段,虛擬機嚴格規定了有且只有五種情況必須立即對“類”進行初始化,而加載和連接過程已經完成
主動引用:
(1)遇到new,getstatic,putstatic,invokestatic指令時,如果類未初始化,則要先觸發初始化
(2)使用Java.lang.reflect包的方法對類進行反射調用的時候,若未初始化則進行初始化
(3)初始化一個類的時候發現其父類未初始化,則需先進行父類的初始化
(4)虛擬機啓動時,用戶需要指定一個main主類,虛擬機會先初始化該主類
(5)使用動態語言支持時,Java.lang.invoke.MethodHandle實例最後的解析結果的方法句柄對應類未初始化則要先初始化

被動引用:
(1)通過子類引用父類的靜態字段,不會導致子類的初始化
(2)通過數組定義來引用類,不會觸發此類的初始化
(3) 常量在編譯階段會存入調用類的常量池中,本質上並沒有直接引用到定義常量的類,因此不會觸發定義常量的類的初始化

初始化接口與初始化類的區別:
當一個類初始化的時候,其父類都初始化過了,但是一個接口初始化時不需要所有父接口初始化,只有在真正用到了父接口的時候纔會初始化

類加載機制
加載,驗證,準備,解析,初始化

加載:
加載是“類加載”的一個過程,在加載過程,虛擬機需要完成3件事情
(1)通過類的全限定名獲取定義此類的二進制字節流
(2)將字節流代表的靜態存儲結構轉化爲方法區運行時的數據結構
(3)在內存中生成一個代表這個類的java.lang.Class對象,作爲方法區這個類的各種數據的訪問入口

驗證:
目的是確保Class文件字節流中包含的信息符合當前虛擬機的要求,並且不會危害虛擬機自身安全
(1)文件格式驗證
(2)元數據驗證
(3)字節碼驗證
(4)符號引用驗證

準備:
準備階段是正式爲類變量分配內存並設置類變量初始值的階段,這些變量所使用的內存都將在方法區中進行分配
爲靜態成員變量賦初始值,通常情況下爲false, null, 0等零值

解析:
虛擬機將常量池內的符號引用替換爲直接引用的過程

初始化過程:
初始化是類加載過程的最後一步,到了初始化階段,開始真正執行類中的Java代碼(或者說字節碼)

在這裏插入圖片描述


Instagram: https://www.instagram.com/barrywzc/
Twitter: https://twitter.com/BarryWa34098316
Bilibili: https://space.bilibili.com/473161964
GitHub: https://github.com/wzcwzcwzc
Patreon: https://www.patreon.com/wzcspace
WeChat: wzcspace


Please leave a LIKE and SUBSCRIBE for more content!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章