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

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

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