欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java虛擬機如何運行Java字節(jié)碼

 更新時間:2024年06月13日 15:10:26   作者:-紅桃K  
這篇文章主要介紹了Java虛擬機如何運行Java字節(jié)碼的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Java虛擬機如何運行Java字節(jié)碼

以標(biāo)準(zhǔn) JDK 中的 HotSpot 虛擬機為例,從虛擬機以及底層硬件兩個角度來看Java 虛擬機具體是怎么運行 Java 字節(jié)碼的。

虛擬機視角

從虛擬機視角來看,執(zhí)行 Java 代碼首先需要將它編譯而成的 class 文件加載到 Java 虛擬機中。

加載后的 Java 類會被存放于方法區(qū)(Method Area)中。

實際運行時,虛擬機會執(zhí)行方法區(qū)內(nèi)的代碼。

在運行過程中,每當(dāng)調(diào)用進入一個 Java 方法,Java 虛擬機會在當(dāng)前線程的 Java 方法棧中生成一個棧幀,用以存放局部變量以及字節(jié)碼的操作數(shù)。

這個棧幀的大小是提前計算好的,而且 Java 虛擬機不要求棧幀在內(nèi)存空間里連續(xù)分布。

當(dāng)退出當(dāng)前執(zhí)行的方法時,不管是正常返回還是異常返回,Java 虛擬機均會彈出當(dāng)前線程的當(dāng)前棧幀,并將之舍棄。

硬件視角

從硬件視角來看,Java 字節(jié)碼無法直接執(zhí)行。因此,Java 虛擬機需要將字節(jié)碼翻譯成機器碼。

在 HotSpot 里面,上述翻譯過程有兩種形式:

  • 第一種是解釋執(zhí)行,即逐條將字節(jié)碼翻譯成機器碼并執(zhí)行;
  • 第二種是即時編譯(Just-In-Time compilation,JIT),即將一個方法中包含的所有字節(jié)碼編譯成機器碼后再執(zhí)行。

前者的優(yōu)勢在于無需等待編譯,而后者的優(yōu)勢在于實際運行速度更快。

HotSpot 默認(rèn)采用混合模式,綜合了解釋執(zhí)行和即時編譯兩者的優(yōu)點。

它會先解釋執(zhí)行字節(jié)碼,而后將其中反復(fù)執(zhí)行的熱點代碼,以方法為單位進行即時編譯。

即時編譯

即時編譯建立在程序符合二八定律的假設(shè)上,也就是百分之二十的代碼占據(jù)了百分之八十的計算資源。

對于占據(jù)大部分的不常用的代碼,我們無需耗費時間將其編譯成機器碼,而是采取解釋執(zhí)行的方式運行;

另一方面,對于僅占據(jù)小部分的熱點代碼,我們則可以將其編譯成機器碼,以達(dá)到理想的運行速度。

為了滿足不同用戶場景的需要,HotSpot 內(nèi)置了多個即時編譯器:C1、C2 和 Graal。

Graal 是 Java 10 正式引入的實驗性即時編譯器,這里暫不做討論。

之所以引入多個即時編譯器,是為了在編譯時間和生成代碼的執(zhí)行效率之間進行取舍。

  • C1 又叫做 Client 編譯器,面向的是對啟動性能有要求的客戶端 GUI 程序,采用的優(yōu)化手段相對簡單,因此編譯時間較短。
  • C2 又叫做 Server 編譯器,面向的是對峰值性能有要求的服務(wù)器端程序,采用的優(yōu)化手段相對復(fù)雜。

因此編譯時間較長,但同時生成代碼的執(zhí)行效率較高。

從 Java 7 開始,HotSpot 默認(rèn)采用分層編譯的方式:熱點方法首先會被 C1 編譯,而后熱點方法中的熱點會進一步被 C2 編譯。

為了不干擾應(yīng)用的正常運行,HotSpot 的即時編譯是放在額外的編譯線程中進行的。

HotSpot 會根據(jù) CPU 的數(shù)量設(shè)置編譯線程的數(shù)目,并且按 1:2 的比例配置給 C1 及 C2 編譯器。

在計算資源充足的情況下,字節(jié)碼的解釋執(zhí)行和即時編譯可同時進行。

編譯完成后的機器碼會在下次調(diào)用該方法時啟用,以替換原本的解釋執(zhí)行。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論