天天看點

JIT與JVM的三種執行模式:解釋模式、編譯模式、混合模式

Java JIT(just in time)即時編譯器是sun公司采用了hotspot虛拟機取代其開發的classic vm之後引入的一項技術,目的在于提高java程式的性能,改變人們“java比C/C++慢很多”這一尴尬印象。

說起來是編譯器,但此編譯器與通常說的javac那個編譯器不同,它其實是将位元組碼編譯為硬體可執行的機器碼的。

JIT與JVM的三種執行模式:解釋模式、編譯模式、混合模式

圖檔來自于網絡

如上圖可以看出,整個java應用程式的執行過程如下:

1、源代碼經javac編譯成位元組碼,class檔案

2、程式位元組碼經過JIT環境變量進行判斷,是否屬于“熱點代碼”(多次調用的方法,或循環等)

3、如是,走JIT編譯為具體硬體處理器(如sparc、intel)機器碼

4、如否,則直接由解釋器解釋執行

5、作業系統及類庫調用

6、硬體

以上實際上是JVM的“混合模式”對java程式的執行方式。

jvm還有兩種執行方式: 解釋執行和編譯執行

      對于解釋執行,不經過jit直接由解釋器解釋執行所有位元組碼,執行效率不高。 而編譯執行不加篩選的将全部代碼進行編譯機器碼不論其執行頻率是否有編譯價值,在程式響應時間的限制下,編譯器沒法采用編譯耗時較高的優化技術(因為JIT的編譯是首次運作或啟動的時候進行的!),是以,在純編譯執行模式下的java程式執行效率跟C/C++也是具有較大差距的。

是以,新版本的jvm預設都是采用混合執行模式。

     這裡有個特别的例子,BEA公司為伺服器硬體和服務端應用專門打造的高度優化的虛拟機————jrockit,由于面向服務端應用,是以它并不在意和關注程式的啟動速度,jrockit并不實作解釋器,而是将所有代碼都交由jit做即時編譯執行。

     jit并不一定總能提高程式的執行效率甚至适得其反,這很大一部分取決于開發人員所寫的程式品質,作為優秀的工程師應該會寫出對jit友好的程式。

------------------越是喧嚣的世界,越需要甯靜的思考------------------

合抱之木,生于毫末;九層之台,起于壘土;千裡之行,始于足下。

積土成山,風雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,聖心備焉。故不積跬步,無以至千裡;不積小流,無以成江海。骐骥一躍,不能十步;驽馬十駕,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇鳝之穴無可寄托者,用心躁也。