java类加载过程_面试官:java类的加载过程
Java 類加載機(jī)制
類從被加載到JVM中開(kāi)始,到卸載為止,整個(gè)生命周期包括:加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用和卸載七個(gè)階段。
其中類加載過(guò)程包括加載、驗(yàn)證、準(zhǔn)備、解析和初始化五個(gè)階段。
類的加載過(guò)程圖
類的加載過(guò)程
加載
1、通過(guò)類加載器,加載.class文件到內(nèi)存中。
2、將讀取到.class數(shù)據(jù)存儲(chǔ)到運(yùn)行時(shí)內(nèi)存區(qū)的方法區(qū)。
3、然后將其轉(zhuǎn)換為一個(gè)與目標(biāo)類型對(duì)應(yīng)的java.lang.Class對(duì)象實(shí)例。這個(gè)Class對(duì)象在日后就會(huì)作為方法區(qū)中該類的各種數(shù)據(jù)的訪問(wèn)入口。
鏈接
驗(yàn)證
確保被加載的類(.class文件的字節(jié)流),是否按照java虛擬的規(guī)范。不會(huì)造成安全問(wèn)題
1、文件格式驗(yàn)證:
第一階段要驗(yàn)證字節(jié)流是否符合 Class文件格式的規(guī)范, 井且能被當(dāng)前版本的虛擬機(jī)處理。這一階段可能包括下面這些驗(yàn)證點(diǎn):
- 是否以魔數(shù) 0xCAFEBABE開(kāi)頭
- 主、次版本號(hào)是否在當(dāng)前虛擬機(jī)處理范圍之內(nèi) 。
- 常量池的常量中是否有不被支持的常量類型(檢查常量tag 標(biāo)志)。
- 指向常量的各種索引值中是否有指向不存在的常量或不符合裝型的常量 。
- CONSTANT_Utf8_info型的常量中是否有不符合 UTF8編碼的數(shù)據(jù)
- Class 文件中各個(gè)部分及文件本身是否有被刪除的或附加的其他信息
實(shí)際上第一階段的驗(yàn)證點(diǎn)還遠(yuǎn)不止這些, 這是其中的一部分。只有通過(guò)了這個(gè)階段的驗(yàn)證之后, 字節(jié)流才會(huì)進(jìn)入內(nèi)存的方法區(qū)中進(jìn)行存儲(chǔ), 所以后面的三個(gè)驗(yàn)證階段全部是基于方法區(qū)的存儲(chǔ)結(jié)構(gòu)進(jìn)行的,不會(huì)再直接操作字節(jié)流。
2、元數(shù)據(jù)驗(yàn)證
第二階段是對(duì)字節(jié)碼描述的信息進(jìn)行語(yǔ)義分析,以保證其描述的信息符合Java語(yǔ)言規(guī)范的要求,這個(gè)階段可能包括的驗(yàn)證點(diǎn)如下:
- 這個(gè)類是否有父類(除了java.lang.0bject之外,所有的類都應(yīng)當(dāng)有父類)
- 這個(gè)類的父類是否繼承了不允許被繼承的類(被finaI修飾的類)
- 如果這個(gè)類不是抽象類, 是否實(shí)現(xiàn)了其父類或接口之中要求實(shí)現(xiàn)的所有方法
- 類中的字段、 方法是否與父類產(chǎn)生了矛盾(例如覆蓋了父類的final字段, 或者出現(xiàn)不符合規(guī)則的方法重載, 例如方法參數(shù)都一致, 但返回值類型卻不同等)
第二階段的驗(yàn)證點(diǎn)同樣遠(yuǎn)不止這些,這一階段的主要目的是對(duì)類的元數(shù)據(jù)信息進(jìn)行語(yǔ)義檢驗(yàn), 保證不存在不符合 Java語(yǔ)言規(guī)范的元數(shù)據(jù)信息。
3、字節(jié)碼驗(yàn)證
第三階段是整個(gè)驗(yàn)證過(guò)程中最復(fù)雜的一個(gè)階段, 主要目的是通過(guò)數(shù)據(jù)流和控制流的分析,確定語(yǔ)義是合法的。符號(hào)邏輯的。在第二階段對(duì)元數(shù)據(jù)信息中的數(shù)據(jù)類型做完校驗(yàn)后,這階段將對(duì)類的方法體進(jìn)行校驗(yàn)分析,保證被校驗(yàn)類的方法在運(yùn)行時(shí)不會(huì)做出危害虛擬機(jī)安全的行為,例如:
- 保證任意時(shí)刻操作數(shù)棧的數(shù)據(jù)裝型與指令代碼序列都能配合工作, 例如不會(huì)出現(xiàn)類似這樣的情況:在操作棧中放置了一個(gè) int類型的數(shù)據(jù), 使用時(shí)卻按long類型來(lái)加載入本地變量表中。
- 保證跳轉(zhuǎn)指令不會(huì)跳轉(zhuǎn)到方法體以外的字節(jié)碼指令上
- 保證方法體中的類型轉(zhuǎn)換是有效的, 例如可以把一個(gè)子類對(duì)象賦值給父類數(shù)據(jù)裝型,這是安全的,但是把父類對(duì)象意賦值給子類數(shù)據(jù)類型,甚至把對(duì)象賦值給與它毫無(wú)繼承關(guān)系、 完全不相干的一個(gè)數(shù)據(jù)類型, 則是危險(xiǎn)和不合法的。
即使一個(gè)方法體通過(guò)了字節(jié)碼驗(yàn)證, 也不能說(shuō)明其一定就是安全的。
4、符號(hào)引用驗(yàn)證
最后一個(gè)階段的校驗(yàn)發(fā)生在虛擬機(jī)將符號(hào)引用轉(zhuǎn)化為直接引用的時(shí)候 , 這個(gè)轉(zhuǎn)化動(dòng)作將在連接的第三個(gè)階段——解析階段中發(fā)生。符號(hào)引用驗(yàn)證可以看做是對(duì)類自身以外(常量池中的各種符號(hào)引用) 的信息進(jìn)行匹配性的校驗(yàn), 通常需要校驗(yàn)以下內(nèi)容:
- 符號(hào)引用中通過(guò)字將串描述的全限定名是否能找到對(duì)應(yīng)的類
- 在指定類中是否存在符合方法的字段描述符以及簡(jiǎn)單名稱所描述的方法和字段 。
- 符號(hào)引用中的類、字段和方法的訪問(wèn)性(private、 protected、 public)是否可被當(dāng)前類訪問(wèn)
符號(hào)引用驗(yàn)證的目的是確保解析動(dòng)作能正常執(zhí)行, 如果無(wú)法通過(guò)符號(hào)引用驗(yàn)證, 將會(huì)拋出一個(gè)java.lang.IncompatibleClassChangError異常的子類, 如 java.lang.IllegalAccessError、java.lang.NoSuchFieldError、java.lang.NoSuchMethodError等。
準(zhǔn)備
主要是為類變量(注意,不是實(shí)例變量)分配內(nèi)存,并且賦予初值,此時(shí)的賦值是Java虛擬機(jī)根據(jù)不同變量類型的默認(rèn)初始值:
如8種基本類型的初值,默認(rèn)為0;引用類型的初值則為null;常量的初值即為代碼中設(shè)置的值
1、final static temp = 100,此時(shí)temp就是賦值 100。
2、String temp = “123456”,此時(shí)temp值就是null。
3、int temp = 100,此時(shí)temp值就是0。
解析
將類的二進(jìn)制數(shù)據(jù)中的符號(hào)引用替換成直接引用(符號(hào)引用是用一組符號(hào)描述所引用的目標(biāo);直接引用是指向目標(biāo)的指針)
可以認(rèn)為是一些靜態(tài)綁定的會(huì)被解析,動(dòng)態(tài)綁定則只會(huì)在運(yùn)行時(shí)進(jìn)行解析;靜態(tài)綁定包括一些final方法(不可以重寫),static方法(只會(huì)屬于當(dāng)前類),構(gòu)造器(不會(huì)被重寫)
在解析階段,虛擬機(jī)會(huì)把所有的類名,方法名,字段名這些符號(hào)引用替換為具體的內(nèi)存地址或偏移量,也就是直接引用。
初始化
初始化,則是為標(biāo)記為常量值的字段賦值的過(guò)程。
換句話說(shuō),只對(duì)static修飾的變量或語(yǔ)句塊進(jìn)行初始化。
如果初始化一個(gè)類的時(shí)候,其父類尚未初始化,則優(yōu)先初始化其父類。
如果同時(shí)包含多個(gè)靜態(tài)變量和靜態(tài)代碼塊,則按照自上而下的順序依次執(zhí)行。
涉及問(wèn)題
一個(gè)類的構(gòu)造器,代碼塊,靜態(tài)代碼塊,成員變量的 的執(zhí)行順序。
//父類
//子類
執(zhí)行結(jié)果:
我是父靜態(tài)成員變量p2
我是父靜態(tài)代碼塊1
我是父靜態(tài)代碼塊2
我是子靜態(tài)成員變量c2
我是子靜態(tài)代碼塊1
我是子靜態(tài)代碼塊2
我是父成員變量p1
我是父代碼塊1
我是父代碼塊2
我是父構(gòu)造器
我是子成員變量c1
我是子代碼塊1
我是子代碼塊2
我是子構(gòu)造器
總結(jié)
以上是生活随笔為你收集整理的java类加载过程_面试官:java类的加载过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java反射机制_java反射机制的讲解
- 下一篇: qq模板图片asqq_重要更新 电脑编辑