1、java虛擬機與程序的生命週期在如下幾種情況下,java虛擬機將結束生命週期:
- 執行
System.exist()
方法 - 程序正常執行結束
- 程序執行過程中 遇到了異常或者錯誤而異常終止
- 由於操作系出現錯誤而導致java虛擬機進程終止
2、類的加載時機:類從被加載到虛擬機內存中開始,到卸載出內存爲止,它的整個生命週期包括:加載、驗證、準備、解析、初始化、使用和卸載7個階段其中驗證、準備和解析3個部分稱爲連接,這7個階段的發生順序如圖所示:
類的加載、驗證、準備、初始化和卸載這5個階段的順序是確定的,解析階段是不一定的,某些情況下可以在初始化之後再解析,這是爲了支持java運行時綁定(動態綁定或者晚期綁定),對於初始化階段,虛擬機規定了只有以下情況下必須對類進行“初始化”:
- 創建類的實例
- 訪問某個類或者接口的靜態變量,或者對靜態變量賦值
- 調用類的靜態方法
- 反射,如
Class.forName("com.xxx.xxx.User")
- 初始化一個類的子類
- Java虛擬機啓動時被標明爲啓動類的類(Main方法的類)
3、類加載的過程
- 加載:查找並加載類的二進制數據
(1)通過一個類的全限定名來獲取定義此類的二進制字節流
(2)將這個字節流所代表的的靜態存儲結構轉化爲方法區的運行時數據結構
(3)在堆內存中生成一個代表這個類的java.lang.Class
對象,作爲方法 區這個類的訪問入口 - 連接:
(1)驗證:確保類的加載的正確性
(2)準備:爲類的靜態變量分配內存並將其初始化爲默認值
(3)解析:把類中的符號引用轉換爲直接引用 - 初始化:爲類的類的靜態變量賦予正確的初始化值