溫馨提示×

溫馨提示×

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

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

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

發(fā)布時間:2021-09-01 21:40:23 來源:億速云 閱讀:138 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“JVM的類加載過程以及雙親委派模型詳細(xì)介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JVM的類加載過程以及雙親委派模型詳細(xì)介紹”吧!

jvm 的主要組成部分

  • 類加載器(ClassLoader)

  • 運(yùn)行時數(shù)據(jù)區(qū)(Runtime Data Area)

  • 執(zhí)行引擎(Execution Engine)

  • 本地庫接口(Native Interface)

jvm 運(yùn)行時數(shù)據(jù)區(qū)的組成

方法區(qū):

①方法區(qū)主要用來存儲已被虛擬機(jī)加載的類信息(構(gòu)造器,接口定義)、常量、靜態(tài)變量和運(yùn)行時常量池等數(shù)據(jù)。

②該區(qū)域是被線程共享的。

③方法區(qū)里有一個運(yùn)行時常量池,用于存放靜態(tài)編譯產(chǎn)生的字面量和符號引用。該常量池具有動態(tài)性,也就是說常量并不一定是編譯時確定,運(yùn)行時生成的常量也會存在這個常量池中。

虛擬機(jī)棧:

虛擬機(jī)棧也叫棧內(nèi)存,主管Java程序的運(yùn)行,是在線程創(chuàng)建時創(chuàng)建,它的生命期是跟隨線程的生命期,線程結(jié)束棧內(nèi)存也就釋放,對于棧來說不存在垃圾回收問題,只要線程一結(jié)束該棧就Over,生命周期和線程一致,是線程私有的。

8種基本類型的變量+對象的引用變量+實(shí)例方法都是在函數(shù)的棧內(nèi)存中分配。

①每個方法在執(zhí)行的時候都會創(chuàng)建一個棧幀,用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接和方法出口等信息。

②虛擬機(jī)棧是線程私有的,它的生命周期與線程相同。

③局部變量表里存儲的是基本數(shù)據(jù)類型、returnAddress類型(指向一條字節(jié)碼指令的地址)和對象引用,這個對象引用有可能是指向?qū)ο笃鹗嫉刂返囊粋€指針,也有可能是代表對象的句柄或者與對象相關(guān)聯(lián)的位置。4.局部變量所需的內(nèi)存空間在編譯器間確定。

④操作數(shù)棧的作用主要用來存儲運(yùn)算結(jié)果以及運(yùn)算的操作數(shù),它不同于局部變量表通過索引來訪問,而是壓棧和出棧的方式

⑤每個棧幀都包含一個指向運(yùn)行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持方法調(diào)用過程中的動態(tài)連接.動態(tài)鏈接就是將常量池中的符號引用在運(yùn)行期轉(zhuǎn)化為直接引用。

本地方法棧

本地方法棧和虛擬機(jī)棧類似,只不過本地方法棧為Native方法服務(wù)。


java堆是所有線程所共享的一塊內(nèi)存,在虛擬機(jī)啟動時創(chuàng)建,幾乎所有的對象實(shí)例都在這里創(chuàng)建,因此該區(qū)域經(jīng)常發(fā)生垃圾回收操作。

程序計數(shù)器

內(nèi)存空間小,字節(jié)碼解釋器工作時通過改變這個計數(shù)值可以選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉(zhuǎn)、異常處理和線程恢復(fù)等功能都需要依賴這個計數(shù)器完成。該內(nèi)存區(qū)域是唯一一個java虛擬機(jī)規(guī)范沒有規(guī)定任何OOM(程序申請內(nèi)存過大,虛擬機(jī)無法滿足我們,然后自殺了)情況的區(qū)域。

程序在虛擬機(jī)中的執(zhí)行過程

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

首先是類加載器來加載class文件得到Class模板,放到方法區(qū)中(類的信息(構(gòu)造器,接口定義)、常量、靜態(tài)變量和運(yùn)行時常量池等數(shù)據(jù)),根據(jù)class模板來實(shí)例化對象的時候,會把對象放在堆中(可以提一下堆分代,垃圾回收策略,垃圾回收算法,內(nèi)存泄漏原因),根據(jù)對象調(diào)用方法時,會將方法壓到棧中(8種基本類型的變量+對象的引用變量+實(shí)例方法),native方法會被壓入到本地方法棧中,由jvm向操作系統(tǒng)發(fā)送指令,由執(zhí)行引擎解釋命令發(fā)送給操作系統(tǒng),操作系統(tǒng)會調(diào)用本地方法接口,用本地方法庫,執(zhí)行本地方法。棧中的方法按照后進(jìn)先出的順序出棧,由程序計數(shù)器來指向下一個出棧的方法,棧中沒有垃圾回收,他們隨著線程的執(zhí)行完畢被釋放。

類加載的雙親委派模型

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

在介紹雙親委派模型之前先說下類加載器。對于任意一個類,都需要由加載它的類加載器和這個類本身一同確立在 JVM 中的唯一性,每一個類加載器,都有一個獨(dú)立的類名稱空間。類加載器就是根據(jù)指定全限定名稱將 class 文件加載到 JVM 內(nèi)存,然后再轉(zhuǎn)化為 class 對象。

類加載器分類:

啟動類加載器(Bootstrap ClassLoader),是虛擬機(jī)自身的一部分,用來加載Java_HOME/lib/目錄中的,或者被 -Xbootclasspath 參數(shù)所指定的路徑中并且被虛擬機(jī)識別的類庫;

擴(kuò)展類加載器(Extension ClassLoader):負(fù)責(zé)加載<java_home >\lib\ext目錄或Java. ext. dirs系統(tǒng)變量指定的路徑中的所有類庫;</java_home>

應(yīng)用程序類加載器(Application ClassLoader)。負(fù)責(zé)加載用戶類路徑(classpath)上的指定類庫,我們可以直接使用這個類加載器。一般情況,如果我們沒有自定義類加載器默認(rèn)就是用這個加載器。

自定義類加載器

他們之間如圖所示是自上向下的關(guān)系。

如果一個類加載器收到了類加載的請求,它首先不會自己去加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,這樣所有的加載請求都會被傳送到頂層的啟動類加載器中,只有當(dāng)父加載無法完成加載請求(它的搜索范圍中沒找到所需的類)時,再從上向下讓子加載器嘗試去加載類。

那么我們?nèi)绾稳ヲ?yàn)證這一說法呢?

我們寫一個簡單地小程序:

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

然后編譯這個java文件,生成class文件。

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

我們把這個文件放在啟動類加載器可以加載到的地方新建目錄classes:D:\Program Files\Java\jdk1.8.0_161\jre\classes
然后將程序的修改:

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

再次編譯,并將生成的classes文件放在擴(kuò)展類啟動器可以加載到的地方新建文件夾classes:D:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\classes
最后,我們再次修改

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

生成的class文件就放在當(dāng)前目錄下。
那么當(dāng)我們執(zhí)行這個class文件的時候出現(xiàn)的結(jié)果是什么呢?

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

這說明,并沒有加載我們當(dāng)前目錄下的class文件,而是用了啟動類加載器掃描范圍內(nèi)的那個文件。
進(jìn)一步驗(yàn)證,我們刪掉D:\Program Files\Java\jdk1.8.0_161\jre\classes下的文件
再次運(yùn)行結(jié)果:

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

結(jié)果變?yōu)閎bb,說明當(dāng)啟動類加載器沒找到class文件,由擴(kuò)展類加載器加載了。
擴(kuò)展類加載器范圍內(nèi)的文件也刪掉呢?

JVM的類加載過程以及雙親委派模型詳細(xì)介紹

終于加載到了當(dāng)前文件夾下的class文件

到此,相信大家對“JVM的類加載過程以及雙親委派模型詳細(xì)介紹”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

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

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

jvm
AI