Java代碼如何運行在Java虛擬機中

我們都知道要運行Java代碼就必須要有JRE,也就是Java運行時環境,JRE中包含了Java程序的必需組件,包括Java虛擬機以及Java核心類庫,然而運行C++代碼則不需要額外的運行時環境,只需要把代碼編譯成CPU能識別的指令即可,也就是機器碼.那爲什麼Java不直接像C++那樣而需要在虛擬機中運行呢?他在虛擬機中又是如何運行的?接着往下看.

Java爲什麼要在虛擬機中運行

剛纔我們談到C++是直接把代碼編譯成機器碼的,但因爲各個平臺的架構不一樣,CPU能處理的指令集也不一樣,所以如果要在另一個平臺上運行C++代碼,就必須用該平臺對應的C++代碼編譯器重新編譯一遍纔可以.Java一開始就意識到需要跨平臺運行,所以Java設計了虛擬機,先將Java代碼編譯成字節碼(class文件),這是虛擬機能夠識別的指令,再由虛擬機內部將字節碼翻譯成機器碼,所以我們只需要有Java字節碼,就可以在不同平臺的虛擬機中運行,這也就是我們一直說的"一次編譯,到處運行".

Java虛擬機如何運行Java字節碼

我們JDK所用的虛擬機名爲HotSpot虛擬機,他會將所有class文件加載進來,加載後的Java類會被放置在方法區,後面運行時會執行其中的代碼.Java虛擬機會在內存中劃分出幾塊,包括程序計數器,本地方法棧,Java虛擬機棧,堆以及方法區.

不過光是Java字節碼還是無法運行,Java虛擬機還需要將字節碼翻譯成機器碼,HotSpot有2種形式:第一種是解釋執行,即將字節碼逐條翻譯成機器碼並運行;第二種是即時編譯(JIT),他會將一個方法內的所有字節碼編譯成機器碼再執行.

圖片描述

前者的優勢無需等待編譯,但逐條解釋的代價就是運行速度會比後者慢,HotSpot默認採用混合模式,它會先解釋執行字節碼,然後對於反覆執行的熱點代碼會去進行即時編譯.

即時編譯是監理在複合二八定律的基礎上,即百分之20的代碼佔據百分之80的計算資源.對於不常用的代碼我們無需消耗時間在編譯成機器碼上,採用解釋執行就可以,而對於熱點代碼我們可以將其編譯成機器碼以提升運行速度.

HotSpot內置了幾個即時編譯器:Client Complier和Server Complier,簡稱爲C1、C2編譯器,以便在編譯時間和生成代碼的執行效率之間做取捨,C1編譯時間更快,C2編譯質量更高.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章