溫馨提示×

溫馨提示×

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

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

Java中的JVM體系結(jié)構(gòu)以及JVM的不同組件介紹

發(fā)布時(shí)間:2020-06-05 17:01:59 來源:億速云 閱讀:220 作者:Leah 欄目:編程語言

一般大家對JVM的了解可能停留在概念的層面上,而對于JVM的工作機(jī)制和體系結(jié)構(gòu)了解相對較少。今天就跟大家聊聊Java中的JVM體系結(jié)構(gòu)以及JVM的不同組件。

什么是JVM?

虛擬機(jī)是物理機(jī)的軟件實(shí)現(xiàn)。Java是根據(jù)WORA(可在任何地方寫入一次)的概念開發(fā)的,可在VM上運(yùn)行。編譯器將Java文件編譯為Java .class文件,然后將該.class文件輸入到JVM中,JVM會(huì)加載并執(zhí)行該類文件。下圖是JVM的體系結(jié)構(gòu)圖。

JVM體系結(jié)構(gòu)圖
Java中的JVM體系結(jié)構(gòu)以及JVM的不同組件介紹

JVM如何工作?

如上面的架構(gòu)圖所示,JVM分為三個(gè)主要子系統(tǒng):
1.類加載器子系統(tǒng)
2.運(yùn)行時(shí)數(shù)據(jù)區(qū)
3.執(zhí)行引擎

1.類加載器子系統(tǒng)
Java的動(dòng)態(tài)類加載功能由類加載器子系統(tǒng)處理。它加載鏈接,并在運(yùn)行時(shí)(而非編譯時(shí))首次引用類時(shí)初始化類文件。

1.1加載
類將由該組件加載。引導(dǎo)類裝入器、擴(kuò)展類裝入器和應(yīng)用程序類裝入器是有助于實(shí)現(xiàn)它的三個(gè)類裝入器。

1.引導(dǎo)程序類加載器–負(fù)責(zé)從引導(dǎo)類路徑加載類,除了rt.jar此加載程序?qū)@得最高優(yōu)先級。
2.擴(kuò)展類加載器–負(fù)責(zé)加載ext文件夾中的類
3.應(yīng)用程序類加載器–負(fù)責(zé)加載應(yīng)用程序級類路徑、提到的環(huán)境變量路徑等。
在加載類文件時(shí),上面的類加載器將遵循委托層次算法。

1.2 鏈接
1.驗(yàn)證 –字節(jié)碼驗(yàn)證器將驗(yàn)證生成的字節(jié)碼是否正確,如果驗(yàn)證失敗,我們將收到驗(yàn)證錯(cuò)誤。
2.準(zhǔn)備-對于所有靜態(tài)變量,將使用默認(rèn)值分配和分配內(nèi)存。
3.解決-所有符號存儲(chǔ)引用都被方法區(qū)域中的原始引用替換。

1.3初始化
這是類加載的最后階段;此處,所有靜態(tài)變量將被分配原始值,并執(zhí)行靜態(tài)塊。

  1. 運(yùn)行時(shí)數(shù)據(jù)區(qū)
    運(yùn)行時(shí)數(shù)據(jù)區(qū)分為五個(gè)主要部分:

1..方法區(qū)域 – 所有類級別的數(shù)據(jù)都將存儲(chǔ)在這里,包括靜態(tài)變量。每個(gè)JVM只有一個(gè)方法區(qū)域,它是共享資源。
2.堆區(qū)– 所有對象及其對應(yīng)的實(shí)例變量和數(shù)組將存儲(chǔ)在此處。 每個(gè)JVM還有一個(gè)堆區(qū)。由于“方法”和“堆”區(qū)域共享多個(gè)線程的內(nèi)存,因此存儲(chǔ)的數(shù)據(jù)不是線程安全的。
3.堆棧區(qū)域 – 對于每個(gè)線程,將創(chuàng)建一個(gè)單獨(dú)的運(yùn)行時(shí)堆棧。對于每個(gè)方法調(diào)用,將在堆棧存儲(chǔ)器中創(chuàng)建一個(gè)條目,稱為堆棧幀。所有局部變量都將在堆棧存儲(chǔ)器中創(chuàng)建。堆棧區(qū)域不是共享資源,因此是線程安全的。 堆棧框架分為三個(gè)子實(shí)體:

1.局部變量數(shù)組– 與該方法相關(guān)的涉及多少局部變量,并且相應(yīng)的值將存儲(chǔ)在此處。
2.操作數(shù)棧 –如果需要執(zhí)行任何中間操作,則操作數(shù)堆棧充當(dāng)執(zhí)行該操作的運(yùn)行時(shí)工作區(qū)。
3.框架數(shù)據(jù) – 與該方法相對應(yīng)的所有符號都存儲(chǔ)在此處。 在任何例外情況下,捕獲塊信息都將保留在幀數(shù)據(jù)中。
4.PC寄存器 – 每個(gè)線程將具有單獨(dú)的PC寄存器,一旦執(zhí)行該指令,將保存當(dāng)前執(zhí)行指令的地址,PC寄存器將用下一條指令更新。
5.本機(jī)方法堆棧– 本機(jī)方法堆棧保存本機(jī)方法信息。對于每個(gè)線程,將創(chuàng)建一個(gè)單獨(dú)的本機(jī)方法堆棧。

  1. 執(zhí)行引擎
    分配給運(yùn)行時(shí)數(shù)據(jù)區(qū)的字節(jié)碼將由執(zhí)行引擎執(zhí)行。執(zhí)行引擎讀取字節(jié)碼并逐段執(zhí)行。

1.解釋器 – 解釋器解釋字節(jié)碼的速度較快,但執(zhí)行速度較慢。解釋器的缺點(diǎn)是,當(dāng)多次調(diào)用一種方法時(shí),每次都需要新的解釋。
2.JIT編譯器 – JIT編譯器消除了解釋器的缺點(diǎn)。執(zhí)行引擎將使用解釋器的幫助來轉(zhuǎn)換字節(jié)碼,但是當(dāng)重復(fù)的代碼時(shí),它將使用JIT編譯器,該編譯器將編譯整個(gè)字節(jié)碼并將其更改為本地代碼。此本地代碼將直接用于重復(fù)的方法調(diào)用,從而提高系統(tǒng)的能。

1.中間代碼生成器 – 生成中間代碼
2.代碼優(yōu)化器 – 負(fù)責(zé)優(yōu)化上面生成的中間代碼
3.目標(biāo)代碼生成器 – 負(fù)責(zé)生成機(jī)器代碼或本機(jī)
4.Profiler – 一個(gè)特殊的組件,負(fù)責(zé)查找熱點(diǎn),即是否多次調(diào)用該方法。
3.垃圾收集器: 收集并刪除未引用的對象??梢酝ㄟ^調(diào)用System.gc()來觸發(fā)垃圾回收,但是不能保證執(zhí)行。JVM的垃圾收集收集創(chuàng)建的對象。
Java本機(jī)接口(JNI): JNI將與本機(jī)方法庫進(jìn)行交互,并提供執(zhí)行引擎所需的本機(jī)庫。

本機(jī)方法庫: 這是本機(jī)庫的集合,這是執(zhí)行引擎所需的。

看完上述內(nèi)容,你們對Java中的JVM體系結(jié)構(gòu)以及JVM的不同組件有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀。

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

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

AI