JIT概念
JIT:Just In Time Compiler穆壕,一般翻譯為即時(shí)編譯器,這是是針對(duì)解釋型語(yǔ)言而言的其屏,而且并非虛擬機(jī)必須喇勋,是一種優(yōu)化手段,Java的商用虛擬機(jī)HotSpot就有這種技術(shù)手段偎行,Java虛擬機(jī)標(biāo)準(zhǔn)對(duì)JIT的存在沒(méi)有作出任何規(guī)范川背,所以這是虛擬機(jī)實(shí)現(xiàn)的自定義優(yōu)化技術(shù)。
HotSpot虛擬機(jī)的執(zhí)行引擎在執(zhí)行Java代碼是可以采用【解釋執(zhí)行】和【編譯執(zhí)行】?jī)煞N方式的蛤袒,如果采用的是編譯執(zhí)行方式渗常,那么就會(huì)使用到JIT,而解釋執(zhí)行就不會(huì)使用到JIT汗盘,所以,早期說(shuō)Java是解釋型語(yǔ)言询一,是沒(méi)有任何問(wèn)題的隐孽,而在擁有JIT的Java虛擬機(jī)環(huán)境下,說(shuō)Java是解釋型語(yǔ)言嚴(yán)格意義上已經(jīng)不正確了健蕊。
HotSpot中的編譯器是javac菱阵,他的工作是將源代碼編譯成字節(jié)碼,這部分工作是完全獨(dú)立的缩功,完全不需要運(yùn)行時(shí)參與晴及,所以Java程序的編譯是半獨(dú)立的實(shí)現(xiàn)。有了字節(jié)碼嫡锌,就有解釋器來(lái)進(jìn)行解釋執(zhí)行虑稼,這是早期虛擬機(jī)的工作流程,后來(lái)势木,虛擬機(jī)會(huì)將執(zhí)行頻率高的方法或語(yǔ)句塊通過(guò)JIT編譯成本地機(jī)器碼蛛倦,提高了代碼執(zhí)行的效率,至此你已經(jīng)了解了JIT在Java虛擬機(jī)中所處的地位和工作的主要內(nèi)容啦桌。
1.JIT的工作原理圖
工作原理
當(dāng)JIT編譯啟用時(shí)(默認(rèn)是啟用的)溯壶,JVM讀入.class文件解釋后,將其發(fā)給JIT編譯器。JIT編譯器將字節(jié)碼編譯成本機(jī)機(jī)器代碼且改。
通常javac將程序源碼編譯验烧,轉(zhuǎn)換成java字節(jié)碼,JVM通過(guò)解釋字節(jié)碼將其翻譯成相應(yīng)的機(jī)器指令又跛,逐條讀入碍拆,逐條解釋翻譯。非常顯然效扫,經(jīng)過(guò)解釋運(yùn)行倔监,其運(yùn)行速度必定會(huì)比可運(yùn)行的二進(jìn)制字節(jié)碼程序慢。為了提高運(yùn)行速度菌仁,引入了JIT技術(shù)浩习。
在執(zhí)行時(shí)JIT會(huì)把翻譯過(guò)的機(jī)器碼保存起來(lái),已備下次使用济丘,因此從理論上來(lái)說(shuō)谱秽,採(cǎi)用該JIT技術(shù)能夠,能夠接近曾經(jīng)純編譯技術(shù)摹迷。
2.相關(guān)知識(shí)
JIT是just in time,即時(shí)編譯技術(shù)疟赊。使用該技術(shù),可以加速java程序的運(yùn)行速度峡碉。
JIT并不總是奏效近哟,不能期望JIT一定可以加速你代碼運(yùn)行的速度,更糟糕的是她有可能減少代碼的運(yùn)行速度鲫寄。這取決于你的代碼結(jié)構(gòu)吉执,當(dāng)然非常多情況下我們還是可以如愿以償?shù)摹?/p>
從上面我們知道了之所以要關(guān)閉JITjava.lang.Compiler.disable(); 是由于加快運(yùn)行的速度。由于JIT對(duì)每條字節(jié)碼都進(jìn)行編譯地来,造成了編譯過(guò)程負(fù)擔(dān)過(guò)重戳玫。為了避免這樣的情況,當(dāng)前的JIT僅僅對(duì)常常運(yùn)行的字節(jié)碼進(jìn)行編譯未斑,如循環(huán)等