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