類加載過程主要包含加載贾费、驗證古毛、準備翻翩、解析都许、初始化、使用嫂冻、卸載七個方面胶征。
1、加載
在加載階段桨仿,虛擬機主要完成三件事:
* 1.通過一個類的全限定名來獲取定義此類的二進制字節(jié)流睛低。
* 2.將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)域的運行時數(shù)據(jù)結(jié)構(gòu)。
* 3.在Java堆中生成一個代表這個類的java.lang.Class對象服傍,作為方法區(qū)域數(shù)據(jù)的訪問入口
2钱雷、驗證
驗證階段作用是保證Class文件的字節(jié)流包含的信息符合JVM規(guī)范,不會給JVM造成危害吹零。如果驗證失敗罩抗,就會拋出一個java.lang.VerifyError異常或其子類異常灿椅。驗證過程分為四個階段
* 1.文件格式驗證:驗證字節(jié)流文件是否符合Class文件格式的規(guī)范套蒂,并且能被當前虛擬機正確的處理。
* 2.元數(shù)據(jù)驗證:是對字節(jié)碼描述的信息進行語義分析茫蛹,以保證其描述的信息符合Java語言的規(guī)范操刀。
* 3.字節(jié)碼驗證:主要是進行數(shù)據(jù)流和控制流的分析,保證被校驗類的方法在運行時不會危害虛擬機麻惶。
* 4.符號引用驗證:符號引用驗證發(fā)生在虛擬機將符號引用轉(zhuǎn)化為直接引用的時候馍刮,這個轉(zhuǎn)化動作將在解析階段中發(fā)生。
3窃蹋、準備
準備階段為變量分配內(nèi)存并設(shè)置類變量的初始化。在這個階段分配的僅為類的變量(static修飾的變量)静稻,而不包括類的實例變量警没。對已非final的變量,JVM會將其設(shè)置成"零值"振湾,而不是其賦值語句的值:
pirvate static int size = 12;
那么在這個階段杀迹,size的值為0,而不是12押搪。 final修飾的類變量將會賦值成真實的值树酪。
4、解析
解析過程是將常量池內(nèi)的符號引用替換成直接引用大州。主要包括四種類型引用的解析续语。類或接口的解析、字段解析厦画、方法解析疮茄、接口方法解析滥朱。
5、初始化
在準備階段力试,類變量已經(jīng)經(jīng)過一次初始化了徙邻,在這個階段,則是根據(jù)程序員通過程序制定的計劃去初始化類的變量和其他資源畸裳。這些資源有static{}塊缰犁,構(gòu)造函數(shù),父類的初始化等怖糊。
至于使用和卸載階段階段民鼓,這里不再過多說明,使用過程就是根據(jù)程序定義的行為執(zhí)行蓬抄,卸載由GC完成丰嘉。