溫馨提示×

溫馨提示×

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

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

JVM的體系結(jié)構(gòu)是什么

發(fā)布時間:2021-06-18 14:49:40 來源:億速云 閱讀:103 作者:Leah 欄目:大數(shù)據(jù)

JVM的體系結(jié)構(gòu)是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

什么是JVM呢?

虛擬機(jī)是物理機(jī)的軟件實現(xiàn)。Java是用WORA(編寫一次運(yùn)行到任何地方)的概念開發(fā)的,它在VM上運(yùn)行。編譯器將Java文件編譯成Java .class文件,然后將.class文件輸入JVM, JVM加載并執(zhí)行類文件。下面是JVM的架構(gòu)圖。

JVM的體系結(jié)構(gòu)是什么

JVM是如何工作的?

如圖所示,JVM分為三個主要子系統(tǒng):

  1. 類加載器子系統(tǒng)

  2. 運(yùn)行時數(shù)據(jù)區(qū)

  3. 執(zhí)行引擎

1. 類加載器子系統(tǒng)

Java的動態(tài)類加載功能由類加載器子系統(tǒng)處理。它裝載的鏈接。在運(yùn)行時而不是編譯時首次引用類時初始化類文件。

1.1 加載

類將由該組件加載。引導(dǎo)類加載器、擴(kuò)展類加載器和應(yīng)用程序類加載器是有助于實現(xiàn)這一目標(biāo)的三個類加載器。

  1. 引導(dǎo)類加載器 – 負(fù)責(zé)從引導(dǎo)類路徑加載類,除了rt.jar什么也沒有。這個加載程序?qū)@得最高優(yōu)先級。

  2. 擴(kuò)展類加載器 – 負(fù)責(zé)加載ext文件夾**(jre\lib)**中的類。

  3. 應(yīng)用程序類加載器 –負(fù)責(zé)加載應(yīng)用程序級類路徑、所述環(huán)境變量的路徑等。

上述類加載器在加載類文件時將遵循委托層次結(jié)構(gòu)算法。

1.2 鏈接
  1. 驗證 – 字節(jié)碼驗證器將驗證生成的字節(jié)碼是否正確,如果驗證失敗,我們將得到驗證錯誤。

  2. 準(zhǔn)備 – 內(nèi)存將為所有靜態(tài)變量分配默認(rèn)值。

  3. 解析 – 所有符號內(nèi)存引用將被來自方法區(qū)域的原始引用所替換。

1.3 初始化

這是類加載的最后階段;在這里,所有靜態(tài)變量都將被賦初始值,并且靜態(tài)塊也會被執(zhí)行。

2. 運(yùn)行時數(shù)據(jù)區(qū)

運(yùn)行時數(shù)據(jù)區(qū)被分為五個主要組件:

  1. 方法區(qū) – 所有類級數(shù)據(jù)都將存儲在這里,包括靜態(tài)變量。每個JVM只有一個方法區(qū),它是資源共享的。

  2. –所有對象及其對應(yīng)的實例變量和數(shù)組都將存儲在這里。每個JVM也僅有一個堆。由于方法區(qū)和堆被多個線程共享內(nèi)存,因此存儲的數(shù)據(jù)不是線程安全的。

  3. –每個線程將創(chuàng)建一個單獨(dú)的運(yùn)行時棧。每個方法調(diào)用都會在棧內(nèi)存中生成一個條目,稱為棧幀。所有本地變量都將在棧內(nèi)存中創(chuàng)建。棧區(qū)域是線程安全的,因為它不是內(nèi)存共享的。

    棧區(qū)域被分為三個部分:

    1. 局部變量數(shù)組 – 與方法相關(guān),涉及到局部變量以及相應(yīng)的值都將存儲在這里。

    2. 操作數(shù)堆棧 –如果需要執(zhí)行任何中間操作,操作數(shù)堆棧充當(dāng)運(yùn)行時工作區(qū)來執(zhí)行操作。

    3. 幀數(shù)據(jù) – 所有與方法對應(yīng)的符號都存儲在這里。在任何異常情況下,catch塊信息都將保存在幀數(shù)據(jù)中。

  4. PC寄存器 – 每個線程將有單獨(dú)的PC寄存器,以保持當(dāng)前執(zhí)行指令的地址一旦指令執(zhí)行,PC寄存器能順利地更新到下一條指令。

  5. 本地方法棧 – 本機(jī)方法棧保存著本地方法信息。對于每個線程,都將創(chuàng)建一個單獨(dú)的本機(jī)方法棧。

3. 執(zhí)行引擎

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

  1. 解釋器 – 解釋器更快地解釋字節(jié)碼,但執(zhí)行速度很慢。解釋器的缺點(diǎn)是,當(dāng)一個方法被多次調(diào)用時,每次都需要一個新的解釋。

  2. JIT編譯器

    – JIT編譯器消除了解釋器的缺點(diǎn)。執(zhí)行引擎將在轉(zhuǎn)換字節(jié)碼時使用解釋器的幫助,但是當(dāng)它發(fā)現(xiàn)重復(fù)的代碼時,它使用JIT編譯器,JIT編譯整個字節(jié)碼并將其更改為本機(jī)代碼。此本機(jī)代碼將直接用于重復(fù)的方法調(diào)用,從而提高系統(tǒng)的性能。

    1. 中間代碼生成器 – 生成中間代碼

    2. 代碼優(yōu)化器 – 負(fù)責(zé)優(yōu)化上面生成的中間代碼

    3. 目標(biāo)代碼生成器 – 負(fù)責(zé)生成機(jī)器代碼或本地代碼

    4. 分析器 – 一個特殊的組件,負(fù)責(zé)尋找熱點(diǎn),即方法是否被多次調(diào)用。

  3. 垃圾收集器:收集和刪除未引用的對象。可以通過調(diào)用 System.gc()觸發(fā)垃圾收集,但不能保證執(zhí)行。JVM的垃圾收集收集創(chuàng)建的對象。

Java本地接口(JNI): JNI將與本地方法庫交互,并提供執(zhí)行引擎所需的本地庫。

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

看完上述內(nèi)容,你們掌握J(rèn)VM的體系結(jié)構(gòu)是什么的方法了嗎?如果還想學(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)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI