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

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

Java爲何要在虛擬機中運行

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

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

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

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

圖片描述

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

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

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

相關文章
相關標籤/搜索