JVM的體系結(jié)構(gòu)是什么,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)是一家專業(yè)提供羅莊企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為羅莊眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
虛擬機(jī)是物理機(jī)的軟件實(shí)現(xiàn)。Java是用WORA(編寫一次運(yùn)行到任何地方)的概念開發(fā)的,它在VM上運(yùn)行。編譯器將Java文件編譯成Java .class文件,然后將.class文件輸入JVM, JVM加載并執(zhí)行類文件。下面是JVM的架構(gòu)圖。
如圖所示,JVM分為三個(gè)主要子系統(tǒng):
類加載器子系統(tǒng)
運(yùn)行時(shí)數(shù)據(jù)區(qū)
執(zhí)行引擎
Java的動(dòng)態(tài)類加載功能由類加載器子系統(tǒng)處理。它裝載的鏈接。在運(yùn)行時(shí)而不是編譯時(shí)首次引用類時(shí)初始化類文件。
類將由該組件加載。引導(dǎo)類加載器、擴(kuò)展類加載器和應(yīng)用程序類加載器是有助于實(shí)現(xiàn)這一目標(biāo)的三個(gè)類加載器。
引導(dǎo)類加載器– 負(fù)責(zé)從引導(dǎo)類路徑加載類,除了rt.jar什么也沒有。這個(gè)加載程序?qū)@得最高優(yōu)先級(jí)。
擴(kuò)展類加載器– 負(fù)責(zé)加載ext文件夾**(jre\lib)**中的類。
應(yīng)用程序類加載器–負(fù)責(zé)加載應(yīng)用程序級(jí)類路徑、所述環(huán)境變量的路徑等。
上述類加載器在加載類文件時(shí)將遵循委托層次結(jié)構(gòu)算法。
驗(yàn)證– 字節(jié)碼驗(yàn)證器將驗(yàn)證生成的字節(jié)碼是否正確,如果驗(yàn)證失敗,我們將得到驗(yàn)證錯(cuò)誤。
準(zhǔn)備– 內(nèi)存將為所有靜態(tài)變量分配默認(rèn)值。
解析– 所有符號(hào)內(nèi)存引用將被來自方法區(qū)域的原始引用所替換。
這是類加載的最后階段;在這里,所有靜態(tài)變量都將被賦初始值,并且靜態(tài)塊也會(huì)被執(zhí)行。
運(yùn)行時(shí)數(shù)據(jù)區(qū)被分為五個(gè)主要組件:
方法區(qū)– 所有類級(jí)數(shù)據(jù)都將存儲(chǔ)在這里,包括靜態(tài)變量。每個(gè)JVM只有一個(gè)方法區(qū),它是資源共享的。
堆–所有對(duì)象及其對(duì)應(yīng)的實(shí)例變量和數(shù)組都將存儲(chǔ)在這里。每個(gè)JVM也僅有一個(gè)堆。由于方法區(qū)和堆被多個(gè)線程共享內(nèi)存,因此存儲(chǔ)的數(shù)據(jù)不是線程安全的。
棧–每個(gè)線程將創(chuàng)建一個(gè)單獨(dú)的運(yùn)行時(shí)棧。每個(gè)方法調(diào)用都會(huì)在棧內(nèi)存中生成一個(gè)條目,稱為棧幀。所有本地變量都將在棧內(nèi)存中創(chuàng)建。棧區(qū)域是線程安全的,因?yàn)樗皇莾?nèi)存共享的。
棧區(qū)域被分為三個(gè)部分:
局部變量數(shù)組– 與方法相關(guān),涉及到局部變量以及相應(yīng)的值都將存儲(chǔ)在這里。
操作數(shù)堆棧–如果需要執(zhí)行任何中間操作,操作數(shù)堆棧充當(dāng)運(yùn)行時(shí)工作區(qū)來執(zhí)行操作。
幀數(shù)據(jù)– 所有與方法對(duì)應(yīng)的符號(hào)都存儲(chǔ)在這里。在任何異常情況下,catch塊信息都將保存在幀數(shù)據(jù)中。
PC寄存器– 每個(gè)線程將有單獨(dú)的PC寄存器,以保持當(dāng)前執(zhí)行指令的地址一旦指令執(zhí)行,PC寄存器能順利地更新到下一條指令。
本地方法棧– 本機(jī)方法棧保存著本地方法信息。對(duì)于每個(gè)線程,都將創(chuàng)建一個(gè)單獨(dú)的本機(jī)方法棧。
被分配給運(yùn)行時(shí)數(shù)據(jù)區(qū)的字節(jié)碼將由執(zhí)行引擎執(zhí)行。執(zhí)行引擎讀取字節(jié)碼并逐個(gè)執(zhí)行。
解釋器– 解釋器更快地解釋字節(jié)碼,但執(zhí)行速度很慢。解釋器的缺點(diǎn)是,當(dāng)一個(gè)方法被多次調(diào)用時(shí),每次都需要一個(gè)新的解釋。
JIT編譯器
– JIT編譯器消除了解釋器的缺點(diǎn)。執(zhí)行引擎將在轉(zhuǎn)換字節(jié)碼時(shí)使用解釋器的幫助,但是當(dāng)它發(fā)現(xiàn)重復(fù)的代碼時(shí),它使用JIT編譯器,JIT編譯整個(gè)字節(jié)碼并將其更改為本機(jī)代碼。此本機(jī)代碼將直接用于重復(fù)的方法調(diào)用,從而提高系統(tǒng)的性能。
中間代碼生成器– 生成中間代碼
代碼優(yōu)化器– 負(fù)責(zé)優(yōu)化上面生成的中間代碼
目標(biāo)代碼生成器– 負(fù)責(zé)生成機(jī)器代碼或本地代碼
分析器– 一個(gè)特殊的組件,負(fù)責(zé)尋找熱點(diǎn),即方法是否被多次調(diào)用。
垃圾收集器:收集和刪除未引用的對(duì)象??梢酝ㄟ^調(diào)用 System.gc()
觸發(fā)垃圾收集,但不能保證執(zhí)行。JVM的垃圾收集收集創(chuàng)建的對(duì)象。
Java本地接口(JNI): JNI將與本地方法庫交互,并提供執(zhí)行引擎所需的本地庫。
本機(jī)方法庫: 這是執(zhí)行引擎所需的本機(jī)庫的集合。
看完上述內(nèi)容,你們掌握J(rèn)VM的體系結(jié)構(gòu)是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!