加載=>驗證=>準備=>解析=>初始化 5個階段所執行的具體動做java
在加載階段,虛擬機須要完成3個事情
1.經過一個類的全限定名獲取定義此類的二進制字節流
2.將這個字節流所表明的靜態存儲結構轉化爲方法區的運行時數據結構
3.在內存中生成一個表明這個類的 java.lang.class 對象,做爲方法區這個類的各類數據的訪問入口程序員
相對於類加載過程的其餘階段,一個非數組類(數組類是由jvm虛擬機直接建立的)的加載過程(加載階段獲取類的二進制字節流的動做)是開發人員可控性最強的,由於加載階段可使用系統提供的引導類加載器去完成,也能夠有開發人員自定義的類加載器去完成,開發人員能夠經過定義本身的類加載器去控制字節流的獲取方式(重寫一個類加載器的loadClass()函數)。數組
加載階段和鏈接階段的部份內容是交叉進行的(如一部分字節碼文件的驗證動做),加載階段還沒有完成,鏈接階段可能已經開始,可是這些夾在加載階段進行之中的動做,仍然屬於鏈接階段的內容,這兩個階段的開始時間仍然保持固定的前後順序。安全
驗證是鏈接階段的第一步,這一階段的目的是爲了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,而且不會危害虛擬機本身的安全。數據結構
java語音自己是相對安全的語音,若是遇到異常代碼(指沒法經過語法檢查的代碼),編譯器是拒絕編譯的,可是全部Class文件並不必定是按照java源碼編譯來的,甚至能夠用十六進制編輯器直接修改產生的Class文件,虛擬機若是不檢查輸入的字節流,而對其徹底信任的話,可能載入了有害的字節流而致使系統崩潰,這是咱們沒法接受的,因此驗證是虛擬機對真身保護的一項重要工做
1.文件格式驗證
第一階段要驗證字節流是否符合Class文件格式規範,而且能被當前版本的虛擬機處理。
2.元數據驗證
第二階段是對字節碼描述的信息進行語義化分析,以保證其描述的信息符合java語音規範的要求。
3.字節碼驗證 第三階段是整個驗證過程當中最複雜的階段,主要是經過數據流和控制流分析,肯定程序語義是合法的,符合邏輯的。這個階段會對類的方法體進行校檢分析,確保在方法運行的時候不能作出危害虛擬機安全的時間。
4.符號引用驗證 最後一個階段的校檢發送在虛擬機將符號引用轉化爲直接引用的時候,這個轉化動做將在鏈接階段的第三個階段,解析階段中發生。jvm
準備階段是正式爲類變量分配內存並設置爲初始值的階段(該階段僅將變量設置爲初始值,而並不是賦值),這些變量所使用的內存都將在方法區中進行分配,這個時候進行的內存分配的僅包括類變量(static修飾的變量),而不包括實例變量,實例變量將會在對象實例化的時候隨着對象一塊兒分配在java堆中。並且這裏所說的初始化一般指數據類型的零值。編輯器
解析階段是虛擬機將常量池內的符號引用替換爲直接引用的過程,主要包括四種類型引用的解析。類或接口的解析、字段解析、方法解析、接口方法解析。函數
java會編譯(相似編譯過程)會把類文件(.java)編譯成class文件(.class),可是這個過程當中若是A類須要引用B類,因爲沒有加載入內存執行,因此他並不知道B類的地址,所以用符號代替,即爲符號引用。到執行程序時會加載類,相關類會進入內存,所以能夠就有了內存地址,A類就能夠將符號引用映射帶B類地址,就是直接引用了!
類初始化階段是類加載過程的最後一步,前面的類加載過程當中,除了在加載階段開發人員能夠用自定義類加載 器參與以外,其餘動做都是有虛擬機主導和控制的,到了初始化階段,才真正開始執行類中定義的java程序代碼。
在準備階段,變量已經付過一次初始值,而在初始化階段,則根據程序員的代碼來進行賦值,初始化階段是執行類的構造器賦值的。這些資源有static{}塊,構造函數,父類的初始化等。spa
至於使用和卸載階段階段,這裏再也不過多說明,使用過程就是根據程序定義的行爲執行,卸載由GC完成。