JIT:Just-in-time compilation,即時編譯;AOT:Ahead-of-time compilation,事前編譯。
JVM即時編譯(JIT)
1. 動態編譯與靜態編譯
動態編譯(dynamic compilation)指的是“在運行時進行編譯”;與之相對的是事前編譯(ahead-of-time compilation,簡稱AOT),也叫靜態編譯(static compilation)。
JIT 編譯狹義來說是當某段代碼即將第一次被執行時進行編譯,因而叫“即時編譯”,JIT 編譯是動態編譯的一種特例。JIT編譯一詞后來被泛化,時常與動態編譯等價;但要注意廣義與狹義的JIT編譯所指的區別。
自適應動態編譯(adaptive dynamic compilation)也是一種動態編譯,但它通常執行的時機比 JIT 編譯遲,先讓程序“以某種式”先運行起來,收集一些信息之后再做動態編譯。這樣的編譯可以更加優化。
2. JVM 運行原理
在部分商用虛擬機中(如 HotSpot),Java 程序最初是通過解釋器(Interpreter)進行解釋執行的,當虛擬機發現某個方法或代碼塊的運行特別頻繁時,就會把這些代碼認定為“熱點代碼”。為了提高熱點代碼的執行效率,在運行時,虛擬機將會把這些代碼編譯成與本地平臺相關的機器碼,并進行各種層次的優化,完成這個任務的編譯器稱為即時編譯器(Just In Time Compiler,下文統稱JIT編譯器)。
即時編譯器并不是虛擬機必須的部分,Java虛擬機規范并沒有規定Java虛擬機內必須要有即時編譯器存在,更沒有限定或指導即時編譯器應該如何去實現。但是,即時編譯器編譯性能的好壞、代碼優化程度的高低卻是衡量一款商用虛擬機優秀與否的最關鍵的指標之一,它也是虛擬機中最核心且最能體現虛擬機技術水平的部分。
由于Java虛擬機規范并沒有具體的約束規則去限制即使編譯器應該如何實現,所以這部分功能完全是與虛擬機具體實現相關的內容,如無特殊說明,我們提到的編譯器、即時編譯器都是指 Hotspot 虛擬機內的即時編譯器,虛擬機也是特指 HotSpot 虛擬機。