來源:blog.csdn.net/hsz2568952354/article/details/96763284
最近在看Java虛擬機,正好看到類加載這塊,所以簡單記錄下所學到的知識,作為筆記,
首先,我們撰寫好的Java代碼,經過編譯變成.class檔案,然后類加載器把.class位元組碼檔案加載到JVM中,接著執行我們的代碼,最后將類卸載出JVM,而從類加載到虛擬機到卸載出虛擬機的這一整個生命周期總共可以分為7個步驟,分別為加載、驗證、準備、決議、初始化、使用和卸載,其中驗證、準備和決議又稱為連接階段,接下來簡單介紹下各個階段是干嘛的,
加載是“類加載”的第一個階段,就是將需要用到的類對應的.class位元組碼檔案加載到虛擬機記憶體,并在方法區中生成一個java.lang.Class物件,作為程式訪問這個類的各種資料的訪問入口,
public class Test {
public static void main(String[] args) {
User user = new User();
}
}
看一下上面這段代碼,經過編譯會生成兩個位元組碼檔案Test.class和User.class,接著會將包含main方法的這個類加載到虛擬機記憶體中開始執行,當執行到User user = new User(),發現需要用到User類,就會將User.class加載到記憶體中,所以簡單的說,當需要用到哪個類時,就回去加載哪個類,Java的自帶的核心類會在虛擬機啟動時就會加載,包括包含main方法的啟動類,但其實,類加載也挺復雜的,只是我了解的也不深,目前就理解成這樣吧,后面再深入研究,
第二階段驗證,從字面上就可以看出這個階段是來校驗加載進來的.class檔案中的內容是否符合規范,畢竟編譯成.class檔案后還是可以人為的對這個檔案進行修改,那如果改的亂七八糟,壓根不符合虛擬機的規范,那虛擬機就沒法執行了,所以說這一步還是比較關鍵的,至于如何驗證,還沒有研究,
準備階段我參考《深入理解Java虛擬機》中的一句話:準備階段是正式為類變數分配記憶體并設定類變數初始值的階段,這些變數所使用的記憶體都將在方法區中進行分配,這也比較好理解,看下面一段代碼:
public class Test {
public static int value = https://www.cnblogs.com/javastack/p/10;
}
當需要用到這個類時,會先將這個類加載到記憶體中,并驗證位元組碼檔案的合法性,驗證通過后就會進行準備作業了,會為這個類中的類變數分配記憶體空間,就是上面的value變數,并給一個初始值,
注意,僅包括類變數,不包括實體變數和區域變數等,并且只是給一個初始值,int型的初始值是0,所以準備過后,value的值是0,而不是10,而真正賦值為10是在初始化階段,我還在其它資料上看到,這一階段也會給這個類分配記憶體空間,先給類分配記憶體,在給它里面的類變數分配記憶體,
決議階段是將常量池中的符號參考替換為直接參考的程序,這一部分內容我還沒搞懂,所以這里就不過多記錄了,簡單了解一下,
初始化階段是類加載中核心的一步了,還是以上面的代碼為例,準備階段我們已經為value變數分配了記憶體空間并給了初始值,現在就是真正給value賦值的時候,把10賦給了value,如果類中還含有靜態代碼塊,也會在這一階段執行,這里還要一點要注意,初始化類的時候,如果父類還沒加載和初始化,也會觸發父類的加載和初始化,
使用就沒什么好說了,初始化完就可以開始使用這個物件了,
卸載是類的生命周期中的最后一階段,即將方法區中無用的類回收,而類需要同時滿足下面3個條件才算無用的類:
- 該類所有的實體都已經被回收,也就是Java堆中不存在該類的任何實體,
- 加載該類的ClassLoader已經被回收,
- 該類對應的
java.lang.Class物件沒有在任何地方被參考,無法在任何地方通過反射訪問該類的方法,
同時滿足上述3個條件的類即可回收,但不一定就會回收,可通過引數配置,
下面用一張圖來簡單展示類的加載流程:

以上就是Java類的加載程序,當然,只是簡單的說明了一下,剛接觸,還是有很多地方不清楚,先大概有一個這樣的印象,后面再慢慢深入理解,
參考資料:
- 《深入理解Java虛擬機》
- 《從0開始帶你成為JVM實戰高手》
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535133.html
標籤:Java
