什么是Java虛擬機(jī)(JVM),它在內(nèi)部如何工作?
Java Virtual Machine(JVM)是??Java運(yùn)行時(shí)環(huán)境(JRE)的關(guān)鍵組成部分,它使計(jì)算機(jī)能夠運(yùn)行Java程序。 JVM是無關(guān)的,這意味著它可以在具有JVM實(shí)現(xiàn)的任何設(shè)備或操作系統(tǒng)上運(yùn)行Java字節(jié)碼。 JVM充當(dāng)Java字節(jié)碼和基礎(chǔ)硬件之間的中介,確??梢詧?zhí)行Java應(yīng)用程序,而無需在不同平臺上重新編譯。
在內(nèi)部,JVM通過幾個(gè)關(guān)鍵階段工作:
-
加載:執(zhí)行Java程序后,JVM首先加載包含字節(jié)碼的
.class
文件。 ClassLoader子系統(tǒng)負(fù)責(zé)將這些文件加載??到內(nèi)存中。 - 驗(yàn)證:加載后,驗(yàn)證了字節(jié)碼,以確保其不會(huì)違反Java的安全性或完整性約束。此步驟有助于防止惡意代碼被執(zhí)行。
- 準(zhǔn)備:在此階段,JVM分配了類變量的內(nèi)存,并將其初始化為默認(rèn)值。
- 解決方案:這涉及從代碼中解決符號引用到直接引用。在此階段,JVM可能需要加載其他類。
- 初始化:在此階段發(fā)生靜態(tài)變量的實(shí)際初始化和靜態(tài)初始塊的執(zhí)行。
- 執(zhí)行: JVM使用執(zhí)行引擎執(zhí)行字節(jié)碼指令。執(zhí)行引擎可以由解釋器和即時(shí)(JIT)編譯器組成。解釋器一一讀取并執(zhí)行字節(jié)碼指令,而JIT編譯器將字節(jié)碼轉(zhuǎn)換為本機(jī)機(jī)器代碼,以更快地執(zhí)行。
- 垃圾收集: JVM管理內(nèi)存分配和交易,以確保通過垃圾收集收回不再需要的內(nèi)存。
JVM及其功能的關(guān)鍵組成部分是什么?
JVM由幾個(gè)關(guān)鍵組件組成,每個(gè)組件都具有特定功能:
- 類Loader子系統(tǒng):此組件負(fù)責(zé)加載,鏈接和初始化類和接口。它使用分層方法來加載來自不同來源的類(例如本地文件系統(tǒng),網(wǎng)絡(luò)位置)。
-
運(yùn)行時(shí)數(shù)據(jù)區(qū)域(內(nèi)存區(qū)域):這包括程序執(zhí)行過程中使用的幾個(gè)內(nèi)存區(qū)域:
- 方法區(qū)域:存儲(chǔ)類結(jié)構(gòu),例如運(yùn)行時(shí)常數(shù)池,字段和方法數(shù)據(jù)。
- 堆區(qū)域:存儲(chǔ)對象并在所有線程之間共享。
- 堆棧區(qū)域:包含存儲(chǔ)局部變量和部分結(jié)果的框架。每個(gè)線程都有自己的堆棧。
- PC寄存器:保留線程執(zhí)行的當(dāng)前指令的地址。
- 天然方法堆棧:類似于堆棧區(qū)域,但用于天然方法。
-
執(zhí)行引擎:此組件執(zhí)行字節(jié)碼指令。它包括:
- 解釋器:一次執(zhí)行字節(jié)碼。
- Just-On-time(JIT)編譯器:將字節(jié)碼編譯到本機(jī)機(jī)器代碼中,以更快地執(zhí)行。
- 垃圾收集器:通過回收不再使用的對象來管理內(nèi)存。
- Java本機(jī)接口(JNI):允許Java代碼通過其他語言(例如C,C和匯編)編寫的本機(jī)應(yīng)用程序和庫來調(diào)用。
- 本機(jī)方法庫: JVM要求的本機(jī)庫的集合來支持本機(jī)方法的執(zhí)行。
JVM如何管理內(nèi)存并執(zhí)行垃圾收集?
JVM中的內(nèi)存管理涉及運(yùn)行時(shí)數(shù)據(jù)區(qū)域內(nèi)內(nèi)存的分配和交易,尤其是堆和堆棧。這是JVM管理內(nèi)存的方式:
-
內(nèi)存分配:
- 堆棧內(nèi)存:用于存儲(chǔ)本地變量和方法調(diào)用詳細(xì)信息。在調(diào)用和返回方法時(shí),將自動(dòng)分配和劃分內(nèi)存。
- 堆內(nèi)存:用于存儲(chǔ)對象。創(chuàng)建新對象并保留使用時(shí),將分配內(nèi)存,直到不再引用它們?yōu)橹埂?/li>
-
垃圾收集:
-
JVM使用垃圾收集來自動(dòng)通過識別和刪除不再引用的對象來自動(dòng)管理堆內(nèi)存。該過程涉及:
- 標(biāo)記階段:垃圾收集器通過追蹤根(全局變量,堆棧變量等)的所有參考來標(biāo)識仍在使用的對象(可觸及)。
- 掃描階段:垃圾收集器收回了標(biāo)記階段中被標(biāo)識為垃圾的對象所占據(jù)的內(nèi)存。
- 緊湊型相(可選):一些垃圾收集器移動(dòng)存活的物體以鞏固自由空間并減少碎片化。
-
常見的垃圾收集算法包括:
- 串行GC:適用于單線程環(huán)境。
- 并行GC:利用多個(gè)線程進(jìn)行垃圾收集來提高性能。
- 并發(fā)標(biāo)記掃描(CMS)GC:通過與應(yīng)用程序線程同時(shí)執(zhí)行其大部分工作來最大程度地減少應(yīng)用程序中的停頓。
- 垃圾 - 首先(G1)GC:專為大堆內(nèi)存區(qū)域而設(shè)計(jì),平衡暫停時(shí)間和吞吐量。
-
JVM適用哪些優(yōu)化來提高Java應(yīng)用程序性能?
JVM應(yīng)用多種優(yōu)化來提高Java應(yīng)用程序的性能:
-
及時(shí)(JIT)匯編:
- JVM使用JIT匯編將字節(jié)碼轉(zhuǎn)換為運(yùn)行時(shí)的本機(jī)機(jī)器代碼。隨著編譯代碼的執(zhí)行速度比解釋字節(jié)模式快得多,因此這會(huì)大大改善。
-
內(nèi)部:
- JIT編譯器可以將小方法插入調(diào)用方法,以減少方法調(diào)用的開銷。這種優(yōu)化可以顯著提高性能,尤其是在經(jīng)常稱為方法中。
-
循環(huán)展開:
- JIT編譯器可以展開循環(huán)以減少環(huán)路控制的開銷,并有可能實(shí)現(xiàn)其他優(yōu)化。這可以通過在單個(gè)循環(huán)迭代中執(zhí)行更多循環(huán)迭代來提高性能。
-
消除代碼:
- JIT編譯器可以檢測和刪除從未執(zhí)行的代碼,從而減少編譯代碼的大小并改善運(yùn)行時(shí)性能。
-
逃生分析:
- 該技術(shù)分析了是否可以在堆棧中分配對象而不是堆,從而有可能減少收集垃圾的需求并提高性能。
-
自適應(yīng)優(yōu)化:
- JVM不斷監(jiān)視應(yīng)用程序的性能,并動(dòng)態(tài)調(diào)整其優(yōu)化策略。例如,它可能會(huì)將經(jīng)常執(zhí)行的方法編譯為本機(jī)代碼,同時(shí)留下較少的關(guān)鍵代碼要解釋。
-
配置文件引導(dǎo)的優(yōu)化:
- JVM使用運(yùn)行時(shí)分析數(shù)據(jù)來指導(dǎo)其優(yōu)化決策。這包括跟蹤方法調(diào)用頻率和分支預(yù)測,以將優(yōu)化工作集中在應(yīng)用程序的最關(guān)鍵部分上。
這些優(yōu)化使JVM能夠通過動(dòng)態(tài)適應(yīng)所執(zhí)行的代碼的特定運(yùn)行時(shí)特征和工作負(fù)載模式來顯著提高Java應(yīng)用程序的性能。
以上是什么是Java虛擬機(jī)(JVM),它在內(nèi)部如何工作?的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)