Android里的Dalvik、ART、JIT、AOT有什么关系?
JIT,Just-in-time,即時編譯,邊運行邊編譯;
AOT,Ahead Of Time,提前編譯,指運行前編譯。
區(qū)別:這兩種編譯方式的主要區(qū)別在于是否在“運行時”進(jìn)行編譯
優(yōu)劣
JIT優(yōu)點:
可以根據(jù)當(dāng)前硬件情況實時編譯生成最優(yōu)機(jī)器指令(ps. AOT也可以做到,在用戶使用時使用字節(jié)碼根據(jù)機(jī)器情況在做一次編譯)
可以根據(jù)當(dāng)前程序的運行情況生成最優(yōu)的機(jī)器指令序列
當(dāng)程序需要支持動態(tài)鏈接時,只能使用JIT
可以根據(jù)進(jìn)程中內(nèi)存的實際情況調(diào)整代碼,使內(nèi)存能夠更充分的利用
JIT缺點:
編譯需要占用運行時資源,會導(dǎo)致進(jìn)程卡頓
由于編譯時間需要占用運行時間,對于某些代碼的編譯優(yōu)化不能完全支持,需要在程序流暢和編譯時間之間做權(quán)衡
在編譯準(zhǔn)備和識別頻繁使用的方法需要占用時間,使得初始編譯不能達(dá)到最高性能
AOT優(yōu)點:
在程序運行前編譯,可以避免在運行時的編譯性能消耗和內(nèi)存消耗
可以在程序運行初期就達(dá)到最高性能
可以顯著的加快程序的啟動
AOT缺點:
在程序運行前編譯會使程序安裝的時間增加
犧牲Java的一致性
將提前編譯的內(nèi)容保存會占用更多的外
與Android的關(guān)聯(lián)
Android在2.2的時候引入JIT,在kitkat時新增了ART(Android RunTime), 在Android L時使用ART完全替代了Dalvik作為默認(rèn)的虛擬機(jī)環(huán)境。
Dalvik
Dalvik使用JIT,使用.dex字節(jié)碼,是針對Android設(shè)備優(yōu)化后的DVM所使用的運行時編譯字節(jié)碼。
.odex是對dex的優(yōu)化,deodex在系統(tǒng)第一次開機(jī)時會提取所有apk內(nèi)的dex文件,odex優(yōu)化將dex提前提取出,加快了開機(jī)的速度和程序運行的速度。
ART
ART 使用AOT,在安裝apk時會進(jìn)行預(yù)編譯,生成OAT文件,仍以.odex保存,但是與Dalvik下不同,這個文件是可執(zhí)行文件。
dex、odex 均可通過dex2oat生成oat文件,以實現(xiàn)兼容性。在大型應(yīng)用安裝時需要更多時間和空間。
在Android N中引入了一種新的編譯模式,同時使用JIT和AOT。這是我在網(wǎng)上找到的一些解釋:
包含了一個混合模式的運行時。應(yīng)用在安裝時不做編譯,而是解釋字節(jié)碼,所以可以快速啟動。ART中有一種新的、更快的解釋器,通過一種新的JIT完成,但是這種JIT的信息不是持久化的。取而代之的是,代碼在執(zhí)行期間被分析,分析結(jié)果保存起來。然后,當(dāng)設(shè)備空轉(zhuǎn)和充電的時候,ART會執(zhí)行針對“熱代碼”進(jìn)行的基于分析的編譯,其他代碼不做編譯。為了得到更優(yōu)的代碼,ART采用了幾種技巧包括深度內(nèi)聯(lián)。 對同一個應(yīng)用可以編譯數(shù)次,或者找到變“熱”的代碼路徑或者對已經(jīng)編譯的代碼進(jìn)行新的優(yōu)化,這取決于分析器在隨后的執(zhí)行中的分析數(shù)據(jù)。
新的ART在安裝程序時使用JIT,在JIT編譯了一些代碼后將這些代碼保存到本地,等到設(shè)備空閑的時候?qū)⒈4娴倪@些代碼使用AOT編譯生成可執(zhí)行文件保存到本地,待下次運行時直接使用,并且不斷監(jiān)視代碼的更新,在代碼有更新后重新生成可執(zhí)行文件。
原文:https://www.cnblogs.com/linghu-java/p/10577515.html
總結(jié)
以上是生活随笔為你收集整理的Android里的Dalvik、ART、JIT、AOT有什么关系?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flash怎么制作交互动画(做一个fla
- 下一篇: 手机充电满了还继续充会伤电池吗