JIT概念
JIT:Just In Time Compiler,一般翻譯為即時編譯器,這是是針對解釋型語言而言的,而且并非虛擬機必須,是一種優(yōu)化手段,Java的商用虛擬機HotSpot就有這種技術手段,Java虛擬機標準對JIT的存在沒有作出任何規(guī)范,所以這是虛擬機實現(xiàn)的自定義優(yōu)化技術。
HotSpot虛擬機的執(zhí)行引擎在執(zhí)行Java代碼是可以采用【解釋執(zhí)行】和【編譯執(zhí)行】兩種方式的,如果采用的是編譯執(zhí)行方式,那么就會使用到JIT,而解釋執(zhí)行就不會使用到JIT,所以,早期說Java是解釋型語言,是沒有任何問題的,而在擁有JIT的Java虛擬機環(huán)境下,說Java是解釋型語言嚴格意義上已經(jīng)不正確了。
HotSpot中的編譯器是javac,他的工作是將源代碼編譯成字節(jié)碼,這部分工作是完全獨立的,完全不需要運行時參與,所以Java程序的編譯是半獨立的實現(xiàn)。有了字節(jié)碼,就有解釋器來進行解釋執(zhí)行,這是早期虛擬機的工作流程,后來,虛擬機會將執(zhí)行頻率高的方法或語句塊通過JIT編譯成本地機器碼,提高了代碼執(zhí)行的效率,至此你已經(jīng)了解了JIT在Java虛擬機中所處的地位和工作的主要內(nèi)容。
1.JIT的工作原理圖

image.png
工作原理
當JIT編譯啟用時(默認是啟用的),JVM讀入.class文件解釋后,將其發(fā)給JIT編譯器。JIT編譯器將字節(jié)碼編譯成本機機器代碼。
通常javac將程序源碼編譯,轉換成java字節(jié)碼,JVM通過解釋字節(jié)碼將其翻譯成相應的機器指令,逐條讀入,逐條解釋翻譯。非常顯然,經(jīng)過解釋運行,其運行速度必定會比可運行的二進制字節(jié)碼程序慢。為了提高運行速度,引入了JIT技術。
在執(zhí)行時JIT會把翻譯過的機器碼保存起來,已備下次使用,因此從理論上來說,採用該JIT技術能夠,能夠接近曾經(jīng)純編譯技術。
2.相關知識
JIT是just in time,即時編譯技術。使用該技術,可以加速java程序的運行速度。
JIT并不總是奏效,不能期望JIT一定可以加速你代碼運行的速度,更糟糕的是她有可能減少代碼的運行速度。這取決于你的代碼結構,當然非常多情況下我們還是可以如愿以償?shù)摹?/p>
從上面我們知道了之所以要關閉JITjava.lang.Compiler.disable(); 是由于加快運行的速度。由于JIT對每條字節(jié)碼都進行編譯,造成了編譯過程負擔過重。為了避免這樣的情況,當前的JIT僅僅對常常運行的字節(jié)碼進行編譯,如循環(huán)等