新聞中心
在 Java 中,類加載的流程有一個專門的機(jī)制叫做“類加載機(jī)制”。類加載機(jī)制是指一個類在 Java 虛擬機(jī)(JVM)中的執(zhí)行流程,它也是 Java 程序能夠正常執(zhí)行的關(guān)鍵所在,那它的具體執(zhí)行流程是啥?接下來我們一起來看。

創(chuàng)新互聯(lián)服務(wù)項目包括四方臺網(wǎng)站建設(shè)、四方臺網(wǎng)站制作、四方臺網(wǎng)頁制作以及四方臺網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,四方臺網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到四方臺省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
流程概述
在 JVM 中,類加載會經(jīng)歷以下 5 個階段:
- 加載階段(Loading)
- 驗證階段(Verification)
- 準(zhǔn)備階段(Preparation)
- 解析階段(Resolution)
- 初始化階段(Initialization)
其中:驗證階段、準(zhǔn)備階段和解析階段合起來又稱為連接階段,所以以上 5 個階段又可以劃分為 3 大類:
- 加載階段(Loading)
- 連接階段(Linking)
- 驗證階段(Verification)
- 準(zhǔn)備階段(Preparation)
- 解析階段(Resolution)
- 初始化階段(Initialization)
具體分類如下圖所示:
這 3 大類、5 個流程的具體執(zhí)行細(xì)節(jié)是這樣的。
1.加載階段
簡單來說,加載階段就是將類文件加載到內(nèi)存中的過程。在加載階段,JVM 需要完成以下 3 件事:
- 通過一個類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流;
- 將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時數(shù)據(jù)結(jié)構(gòu);
- 在內(nèi)存中生成一個代表這個類的 java.lang.Class 對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口。
2.連接階段
連接階段又分為:驗證階段(Verification)、準(zhǔn)備階段(Preparation)和解析階段(Resolution),具體執(zhí)行的細(xì)節(jié)如下。
2.1 驗證階段
驗證階段也叫做校驗階段,它主要是用來驗證加載到內(nèi)存中的類是否是安全合規(guī)的文件,驗證的主要動作大概有以下幾個(當(dāng)然,以下細(xì)節(jié)如果實在記不住也沒關(guān)系):
- 文件格式校驗包括常量池中的常量類型、Class 文件的各個部分是否被刪除或被追加了其他信息等;
- 元數(shù)據(jù)校驗包括父類正確性校驗(檢查父類是否有被 final 修飾)、抽象類校驗等;
- 字節(jié)碼校驗,此步驟最為關(guān)鍵和復(fù)雜,主要用于校驗程序中的語義是否合法且符合邏輯;
- 符號引用校驗,對類自身以外比如常量池中的各種符號引用的信息進(jìn)行匹配性校驗。
2.2 準(zhǔn)備階段
準(zhǔn)備階段就開始給類中的靜態(tài)變量設(shè)置默認(rèn)值了,注意這里不是給靜態(tài)變量設(shè)置初始值,而是設(shè)置默認(rèn)值,二者還是有很大區(qū)別的。舉個例子,比如代碼中寫的內(nèi)容是:
public static int number = 10;
那么此時是給 number 變量設(shè)置的 int 值是默認(rèn)值 0,而非初始值 10。
2.3 解析階段
解析階段就是將常量池中的符號引用更換成直接引用了,所謂的符號引用是指以一組符號來描述所引用的目標(biāo),符號可以是任何形式的字面量,只要使用時能無歧義地定位到目標(biāo)即可;而直接引用是可以直接指向目標(biāo)的指針、相對偏移量或者是一個能間接定位到目標(biāo)的句柄。符號引用和直接引用有一個重要的區(qū)別:使用符號引用時被引用的目標(biāo)不一定已經(jīng)加載到內(nèi)存中;而使用直接引用時,引用的目標(biāo)必定已經(jīng)存在虛擬機(jī)的內(nèi)存中了。
3.初始化階段
初始化階段,Java 虛擬機(jī)真正開始執(zhí)行類中編寫的 Java 程序代碼,將主導(dǎo)權(quán)移交給應(yīng)用程序。到這一步驟之后,類的加載過程就算正式完成了,此時會給靜態(tài)變量設(shè)置初始值,并執(zhí)行靜態(tài)代碼塊的內(nèi)容。
總結(jié)
類加載流程總共分為 3 大類,5 個主要流程:
- 加載階段(Loading):將類文件加載到內(nèi)存。
- 連接階段(Linking)
- 驗證階段(Verification):類文件安全性效驗。
- 準(zhǔn)備階段(Preparation):給靜態(tài)變量設(shè)置默認(rèn)值。
- 解析階段(Resolution):將符號引用轉(zhuǎn)換為直接引用。
- 初始化階段(Initialization):執(zhí)行靜態(tài)代碼塊和給靜態(tài)變量設(shè)置初始值。
分享名稱:類是如何加載的?你學(xué)會了嗎?
當(dāng)前網(wǎng)址:http://www.fisionsoft.com.cn/article/dhspecd.html


咨詢
建站咨詢
