程序員看似光鮮的就業(yè)前景面前,逃不過(guò)的是層層的面試,想要進(jìn)前沿的大公司沒(méi)有個(gè)五六七八面,是不可能滴!而找工作的首個(gè)關(guān)卡就是筆試,想要獲得高薪工作的小伙伴,先刷一波面試題吧!
今天千鋒java培訓(xùn)老師給大家分享的面試題是——類的加載過(guò)程。
類加載過(guò)程主要包含加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用、卸載七個(gè)方面,下面一一闡述。
一、加載
在加載階段,虛擬機(jī)主要完成三件事:
1.通過(guò)一個(gè)類的全限定名來(lái)獲取定義此類的二進(jìn)制字節(jié)流。
2.將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)域的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。
3.在Java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為方法區(qū)域數(shù)據(jù)的訪問(wèn)入口
二、驗(yàn)證
驗(yàn)證階段作用是保證Class文件的字節(jié)流包含的信息符合JVM規(guī)范,不會(huì)給JVM造成危害。如果驗(yàn)證失敗,就會(huì)拋出一個(gè)java.lang.VerifyError異?;蚱渥宇惍惓?。驗(yàn)證過(guò)程分為四個(gè)階段
1.文件格式驗(yàn)證:驗(yàn)證字節(jié)流文件是否符合Class文件格式的規(guī)范,并且能被當(dāng)前虛擬機(jī)正確的處理。
2.元數(shù)據(jù)驗(yàn)證:是對(duì)字節(jié)碼描述的信息進(jìn)行語(yǔ)義分析,以保證其描述的信息符合Java語(yǔ)言的規(guī)范。
3.字節(jié)碼驗(yàn)證:主要是進(jìn)行數(shù)據(jù)流和控制流的分析,保證被校驗(yàn)類的方法在運(yùn)行時(shí)不會(huì)危害虛擬機(jī)。
4.符號(hào)引用驗(yàn)證:符號(hào)引用驗(yàn)證發(fā)生在虛擬機(jī)將符號(hào)引用轉(zhuǎn)化為直接引用的時(shí)候,這個(gè)轉(zhuǎn)化動(dòng)作將在解析階段中發(fā)生。
三、準(zhǔn)備
準(zhǔn)備階段為變量分配內(nèi)存并設(shè)置類變量的初始化。在這個(gè)階段分配的僅為類的變量(static修飾的變量),而不包括類的實(shí)例變量。對(duì)已非final的變量,JVM會(huì)將其設(shè)置成“零值”,而不是其賦值語(yǔ)句的值:
pirvate static int size = 12;
那么在這個(gè)階段,size的值為0,而不是12。 final修飾的類變量將會(huì)賦值成真實(shí)的值。
四、解析
解析過(guò)程是將常量池內(nèi)的符號(hào)引用替換成直接引用。主要包括四種類型引用的解析。類或接口的解析、字段解析、方法解析、接口方法解析。
五、初始化
在準(zhǔn)備階段,類變量已經(jīng)經(jīng)過(guò)一次初始化了,在這個(gè)階段,則是根據(jù)程序員通過(guò)程序制定的計(jì)劃去初始化類的變量和其他資源。這些資源有static{}塊,構(gòu)造函數(shù),父類的初始化等。
至于使用和卸載階段階段,這里不再過(guò)多說(shuō)明,使用過(guò)程就是根據(jù)程序定義的行為執(zhí)行,卸載由GC完成。