JIT與Dalvik
JIT是"Just In Time Compiler"的縮寫耕漱,就是"即時(shí)編譯技術(shù)",與Dalvik虛擬機(jī)相關(guān)抬伺。
怎么理解這句話呢螟够?這要從Android的一些特性說(shuō)起。
JIT是在2.2版本提出的峡钓,目的是為了提高Android的運(yùn)行速度妓笙,一直存活到4.4版本,因?yàn)樵?.4之后的ROM中能岩,就不存在Dalvik虛擬機(jī)了寞宫。
我們使用Java開(kāi)發(fā)android,在編譯打包APK文件時(shí)捧灰,會(huì)經(jīng)過(guò)以下流程
Java編譯器將應(yīng)用中所有Java文件編譯為class文件
dx工具將應(yīng)用編譯輸出的類文件轉(zhuǎn)換為Dalvik字節(jié)碼淆九,即dex文件
之后經(jīng)過(guò)簽名统锤、對(duì)齊等操作變?yōu)锳PK文件毛俏。
Dalvik虛擬機(jī)可以看做是一個(gè)Java VM炭庙,他負(fù)責(zé)解釋dex文件為機(jī)器碼,如果我們不做處理的話煌寇,每次執(zhí)行代碼焕蹄,都需要Dalvik將dex代碼翻譯為微處理器指令,然后交給系統(tǒng)處理阀溶,這樣效率不高腻脏。
為了解決這個(gè)問(wèn)題,Google在2.2版本添加了JIT編譯器银锻,當(dāng)App運(yùn)行時(shí)永品,每當(dāng)遇到一個(gè)新類,JIT編譯器就會(huì)對(duì)這個(gè)類進(jìn)行編譯击纬,經(jīng)過(guò)編譯后的代碼鼎姐,會(huì)被優(yōu)化成相當(dāng)精簡(jiǎn)的原生型指令碼(即native code),這樣在下次執(zhí)行到相同邏輯的時(shí)候更振,速度就會(huì)更快炕桨。
當(dāng)然使用JIT也不一定加快執(zhí)行速度,如果大部分代碼的執(zhí)行次數(shù)很少肯腕,那么編譯花費(fèi)的時(shí)間不一定少于執(zhí)行dex的時(shí)間献宫。Google當(dāng)然也知道這一點(diǎn),所以JIT不對(duì)所有dex代碼進(jìn)行編譯实撒,而是只編譯執(zhí)行次數(shù)較多的dex為本地機(jī)器碼姊途。
有一點(diǎn)需要注意,那就是dex字節(jié)碼翻譯成本地機(jī)器碼是發(fā)生在應(yīng)用程序的運(yùn)行過(guò)程中的知态,并且應(yīng)用程序每一次重新運(yùn)行的時(shí)候捷兰,都要做重做這個(gè)翻譯工作,所以這個(gè)工作并不是一勞永逸肴甸,每次重新打開(kāi)App寂殉,都需要JIT編譯。
另外原在,Dalvik虛擬機(jī)從Android一出生一直活到4.4版本友扰,而JIT在Android剛發(fā)布的時(shí)候并不存在,在2.2之后才被添加到Dalvik中庶柿。
ART與AOT
AOT是"Ahead Of Time"的縮寫村怪,指的就是ART(Anroid RunTime)這種運(yùn)行方式。
前面介紹過(guò)浮庐,JIT是運(yùn)行時(shí)編譯甚负,這樣可以對(duì)執(zhí)行次數(shù)頻繁的dex代碼進(jìn)行編譯和優(yōu)化柬焕,減少以后使用時(shí)的翻譯時(shí)間,雖然可以加快Dalvik運(yùn)行速度梭域,但是還是有弊病斑举,那就是將dex翻譯為本地機(jī)器碼也要占用時(shí)間,所以Google在4.4之后推出了ART病涨,用來(lái)替換Dalvik富玷。
在4.4版本上,兩種運(yùn)行時(shí)環(huán)境共存既穆,可以相互切換赎懦,但是在5.0+,Dalvik虛擬機(jī)則被徹底的丟棄幻工,全部采用ART励两。
ART的策略與Dalvik不同,在ART 環(huán)境中囊颅,應(yīng)用在第一次安裝的時(shí)候当悔,字節(jié)碼就會(huì)預(yù)先編譯成機(jī)器碼,使其成為真正的本地應(yīng)用迁酸。之后打開(kāi)App的時(shí)候先鱼,不需要額外的翻譯工作,直接使用本地機(jī)器碼運(yùn)行奸鬓,因此運(yùn)行速度提高焙畔。
當(dāng)然ART與Dalvik相比,還是有缺點(diǎn)的串远。
ART需要應(yīng)用程序在安裝時(shí)宏多,就把程序代碼轉(zhuǎn)換成機(jī)器語(yǔ)言,所以這會(huì)消耗掉更多的存儲(chǔ)空間澡罚,但消耗掉空間的增幅通常不會(huì)超過(guò)應(yīng)用代碼包大小的20%
由于有了一個(gè)轉(zhuǎn)碼的過(guò)程伸但,所以應(yīng)用安裝時(shí)間難免會(huì)延長(zhǎng)
但是這些與更流暢的Android體驗(yàn)相比而言,不值一提留搔。
總結(jié)
通過(guò)前面背景知識(shí)的介紹更胖,我終于可以更簡(jiǎn)單的介紹這四個(gè)名詞之間的關(guān)系了:
JIT代表運(yùn)行時(shí)編譯策略,也可以理解成一種運(yùn)行時(shí)編譯器隔显,是為了加快Dalvik虛擬機(jī)解釋dex速度提出的一種技術(shù)方案却妨,來(lái)緩存頻繁使用的本地機(jī)器碼
ART和Dalvik都算是一種Android運(yùn)行時(shí)環(huán)境,或者叫做虛擬機(jī)括眠,用來(lái)解釋dex類型文件彪标。但是ART是安裝時(shí)解釋,Dalvik是運(yùn)行時(shí)解釋
AOT可以理解為一種編譯策略掷豺,即運(yùn)行前編譯捞烟,ART虛擬機(jī)的主要特征就是AOT