Java JIT(just in time)即時編譯器是sun公司采用了hotspot虛擬機取代其開發的classic vm之后引入的一項技術,目的在於提高java程序的性能,改變人們“java比C/C++慢很多”這一尷尬印象。
說起來是編譯器,但此編譯器與通常說的javac那個編譯器不同,它其實是將字節碼編譯為硬件可執行的機器碼的。
圖片來自於網絡
如上圖可以看出,整個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友好的程序。
