Java虛擬機(jī)與程序的生命周期
在如下幾種情況下,Java虛擬機(jī)將結(jié)束生命周期
- 執(zhí)行了System.exit()方法
- 程序正常執(zhí)行結(jié)束
- 程序在執(zhí)行過程中遇到了異常或錯誤而異常終止
- 由于操作系統(tǒng)出現(xiàn)錯誤而導(dǎo)致Java虛擬機(jī)進(jìn)程終止
類的生命周期

1. 類生命周期.png
在Java代碼中,類型的加載(class interface enum)的加載、連接與初始化過程都是在程序運(yùn)行期間完成的
上圖是一個類的生命周期,后面會詳細(xì)對這個生命周期做介紹的
類加載
查找并加載類的二進(jìn)制數(shù)據(jù),把class文件加載到內(nèi)存
類連接
類連接又分為三個階段
- 驗證:確保被加載的類的正確性
- 準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值
- 解析:把類中的符號引用轉(zhuǎn)換為直接引用
類初始化
為類的靜態(tài)變量賦予正確的初始值
類加載、連接與初始化如圖所示

001.類的加載、連接與初始化.png
類的使用方式
Java程序?qū)︻惖氖褂梅绞娇煞譃閮煞N,主動使用和被動使用
主動使用(七種)
- 創(chuàng)建類的實例
- 訪問某個類或接口的靜態(tài)變量,或者對該靜態(tài)變量賦值
- 調(diào)用類的靜態(tài)方法
- 反射(如Class.forName("com.test.Test"))
- 初始化一個類的子類
- Java虛擬機(jī)啟動時被標(biāo)明為啟動類的類(Test類包含main()方法,使用Java Test啟動)
- JDK1.7開始提供的動態(tài)語言支持,java.lang.invoke.MethodHandle實例的解析結(jié)果REF_getStatic,REF_putStatic,REF_invokeStatic句柄對應(yīng)的類沒有初始化,則初始化
除了以上七種情況,其他使用Java類的方式都被看作是對類的被動使用,都不會導(dǎo)致類的初始化
所有的Java虛擬機(jī)實現(xiàn)必須在每個類或接口被Java程序"首次主動使用"時才初始化他們