類從被加載到虛擬機內存中開始,到卸載出內存爲止,它的整個生命週期包括:java
(1)加載程序員
(2)驗證安全
(3)準備數據結構
(4)解析spa
(5)初始化code
(6)使用對象
(7)卸載blog
一共7個階段。其中驗證、準備、解析這3個階段統稱爲鏈接。生命週期
這類加載的7個階段順序流程:內存
加載、驗證、準備、初始化和卸載這5個階段的順序是肯定的。類的加載過程當中必須按照這種順序循序漸進地開始,而解析階段則是不必定的,它在某些狀況下能夠在初始化階段以後再開始,這是爲了支持JAVA語言的運行時綁定(也稱爲動態綁定和晚期綁定)。
初始化的時候執行一些靜態代碼塊,靜態變量等。
包括:加載、鏈接(驗證、準備、解析)、初始化。
(1)加載:「加載」是「類加載」的過程的一個階段,在加載階段虛擬機須要完成3件事:
a、經過一個類的全限定名來獲取定義此類的二進制字節流。
b、將這個字節流所表明的靜態存儲結構轉換爲方法區的運行時數據結構。
c、在內存中生成一個表明這個類的java.lang.Class對象,做爲方法區這個類的各類數據的訪問入口。
(2)驗證:驗證是鏈接階段的第一步,這個階段的目的是爲了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,而且不會危害虛擬機的自身安全。
(3)準備:準備階段是正式爲類變量分配內存並設置類變量初始值的階段,這些變量所使用的內存都將在方法區中進行分配。首先,這時候進行內存分配的僅包括類變量(被static修飾的變量)。而不包括實例變量。實例變量將會在對象實例化時隨着對象一塊兒分配在java堆中。其次,這裏所說的初始值「一般狀況」下是數據類型的零值,假設一個類變量的定義爲:
public static int value = 112;
那變量value值在準備階段事後的初始值爲0而不是112。由於這時候還沒有開始執行任何JAVA方法。而把value賦值爲112的public static 指令是程序編譯後,存放於構造器<cinit>()方法 之中,因此把value賦值爲112的動做將在初始化階段纔會執行。
對於那種不是「一般狀況」,而是「特殊狀況」的變量:
public static int value = 123;
編譯的時候Javac將會爲value生成ConstantValue屬性,在準備階段虛擬機就會根據ConstantValue的設置將value賦值爲123,。
(4)解析:解析階段是將虛擬機常量池內的符號引用替換爲直接引用的過程。
(5)初始化:類初始化是類加載過程的最後一步,在這個階段,前面的類加載過程當中,除了在加載階段用戶應用程序能夠經過自定義加載器參與以外,其他動做徹底由虛擬機主導和控制。到了初始化階段,才真正開始執行類中定義的Java程序代碼(或者說字節碼)。在準備階段,變量已經賦值過一次系統要求的初始值,而在初始化階段,則根據程序員經過程序制定的主觀計劃去初始化變量和其餘資源,或者能夠從另一個角度來表達,初始化階段就是執行類構造器<cinti>()方法的過程。