溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

jvm類加載的過程可分為哪三步

發(fā)布時(shí)間:2020-10-27 12:06:03 來源:億速云 閱讀:142 作者:小新 欄目:編程語言

小編給大家分享一下jvm類加載的過程可分為哪三步,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

jvm類加載的過程分為三步:加載、連接和初始化。

jvm類加載的過程可分為哪三步

加載

通過類的全路徑將這個(gè)類從外部加載到j(luò)vm中,同時(shí)在方法區(qū)生成該類的描述信息并在內(nèi)存生成該類的Claas類型。作為方法區(qū)這個(gè)類的數(shù)據(jù)訪問入口。

連接

這是很重要的一步,過程比較復(fù)雜,分為三步:驗(yàn)證、準(zhǔn)備和解析。    

驗(yàn)證:確保類加載的正確性。一般情況由javac編譯的class文件是不會(huì)有問題的,但是可能有人的class文件是自己通過其他方式編譯出來的,這就很有可能不符合jvm的編 譯規(guī)則,這一步就是要過濾掉這部分不合法文件 

準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,將其初始化為默認(rèn)值 。我們都知道靜態(tài)變量是可以不用我們手動(dòng)賦值的,它自然會(huì)有一個(gè)初始值 比如int 類型的初始值就是0 ;boolean類型初始值為false,引用類型的初始值為null 。 這里注意,只是為靜態(tài)變量分配內(nèi)存,此時(shí)是沒有對(duì)象實(shí)例的 

解析:把類中的符號(hào)引用轉(zhuǎn)化為直接引用。解釋一下符號(hào)引用和直接引用。比如在方法A中使用方法B,A(){B();},這里的B()就是符號(hào)引用,初學(xué)java時(shí)我們都是知道這是java的引用,以為B指向B方法的內(nèi)存地址,但是這是不完整的,這里的B只是一個(gè)符號(hào)引用,它對(duì)于方法的調(diào)用沒有太多的實(shí)際意義,可以這么認(rèn)為,他就是給程序員看的一個(gè)標(biāo)志,讓程序員知道,這個(gè)方法可以這么調(diào)用,但是B方法實(shí)際調(diào)用時(shí)是通過一個(gè)指針指向B方法的內(nèi)存地址,這個(gè)指針才是真正負(fù)責(zé)方法調(diào)用,他就是直接引用。

初始化

在初始化階段會(huì)調(diào)用類的初始化方法clinit()為靜態(tài)變量賦予實(shí)際的值(例如將value賦值為123)、執(zhí)行靜態(tài)代碼塊。在 JVM 規(guī)范中沒有強(qiáng)制約束加載的時(shí)機(jī),不過對(duì)于初始化,JVM規(guī)范嚴(yán)格規(guī)定了有且只有5種情況必須立即對(duì)類進(jìn)行初始化:

下面我們講解 一下clinit()方法是怎么生成的。clinit()方法是編譯器 自動(dòng)收集類中的靜態(tài)變量和靜態(tài)語句所產(chǎn)生的。編譯器收集的順序是由語句出現(xiàn)的順序 所 決定的,靜態(tài)語句塊只能復(fù)制定義在它后面的變量,但是不能使用,如下 圖 所示,而且虛擬機(jī)規(guī)范保證,父類的clinit()方法一定 在子類之前執(zhí)行,但不是 通過繼承來的。

以上是jvm類加載的過程可分為哪三步的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI