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

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

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

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

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

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

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)
