天天看點

codeblocks無法編譯運作_你寫的代碼,是如何在虛拟機運作的?

我們都知道要運作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),他會将一個方法内的所有位元組碼編譯成機器碼再執行.

codeblocks無法編譯運作_你寫的代碼,是如何在虛拟機運作的?

前者的優勢無需等待編譯,但逐條解釋的代價就是運作速度會比後者慢,HotSpot預設采用混合模式,它會先解釋執行位元組碼,然後對于反複執行的熱點代碼會去進行即時編譯.

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

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

快資訊

繼續閱讀