android Q 對(duì)ART的優(yōu)化
簡(jiǎn)單說兩大優(yōu)化,提升性能
JIT優(yōu)化
Android Q 大幅改進(jìn)了 ART 運(yùn)行時(shí)信粮。所謂運(yùn)行時(shí)改進(jìn)就是對(duì)編譯器(JIT)的改進(jìn),開發(fā)者無需進(jìn)行任何操作谎倔,便可有效縮短應(yīng)用的啟動(dòng)時(shí)間,減少內(nèi)存消耗侯勉,并提高應(yīng)用的運(yùn)行流暢度焕盟。
ART 配置文件,允許 ART 在應(yīng)用開始運(yùn)行之前就預(yù)編譯一部分代碼介衔『夼撸基于云的編譯文件適用于所有應(yīng)用,而且運(yùn)行 Android P 或更高版本系統(tǒng)的設(shè)備目前已提供相關(guān)支持炎咖。GC優(yōu)化
ART 的并發(fā)復(fù)制垃圾收集器 (Concurrent Copying Garbage Collector) 中添加了分代收集機(jī)制 (Generational Garbage Collection)赃泡。分代算法可以將新生代的對(duì)象單獨(dú)收集出來,與 full-heap GC 相比成本更小乘盼。引入分代算法后升熊,ART 垃圾回收速度和 CPU 利用效率有了明顯提升,在減少垃圾的同時(shí)绸栅,讓應(yīng)用可以在低端設(shè)備上更流暢地運(yùn)行
ART編譯器-JIT
Android 運(yùn)行時(shí) (ART) 包含一個(gè)具備代碼分析功能的即時(shí) (JIT) 編譯器级野,該編譯器可以在 Android 應(yīng)用運(yùn)行時(shí)持續(xù)提高其性能。JIT 編譯器補(bǔ)充了 ART 當(dāng)前的預(yù)先 (AOT) 編譯器的功能粹胯,有助于提高運(yùn)行時(shí)性能蓖柔,節(jié)省存儲(chǔ)空間,以及加快應(yīng)用及系統(tǒng)更新速度风纠。相較于 AOT 編譯器况鸣,JIT 編譯器的優(yōu)勢(shì)也更為明顯,因?yàn)樗粫?huì)在應(yīng)用自動(dòng)更新期間或重新編譯應(yīng)用(在無線下載 (OTA) 更新期間)時(shí)拖慢系統(tǒng)速度竹观。
盡管 JIT 和 AOT 使用相同的編譯器镐捧,它們所進(jìn)行的一系列優(yōu)化也較為相似,但它們生成的代碼可能會(huì)有所不同臭增。JIT 會(huì)利用運(yùn)行時(shí)類型信息懂酱,可以更高效地進(jìn)行內(nèi)聯(lián),并可讓堆棧替換 (OSR) 編譯成為可能速址,而這一切都會(huì)使其生成的代碼略有不同玩焰。
JIT編譯
1、用戶運(yùn)行應(yīng)用芍锚,而這隨后就會(huì)觸發(fā) ART 加載 .dex 文件昔园。
- 如果有 .oat 文件(即 .dex 文件的 AOT 二進(jìn)制文件),則 ART 會(huì)直接使用該文件并炮。雖然 .oat 文件會(huì)定期生成默刚,但文件中不一定會(huì)包含經(jīng)過編譯的代碼(即 AOT 二進(jìn)制文件)。
- 如果 .oat 文件不包含編譯的代碼逃魄,ART 會(huì)通過 JIT 和解釋器執(zhí)行 .dex 文件荤西。
1、針對(duì)任何未根據(jù) speed 編譯過濾器編譯的應(yīng)用啟用 JIT(也就是說,要盡可能多地編譯應(yīng)用中的代碼)邪锌。
2勉躺、將 JIT 配置文件數(shù)據(jù)轉(zhuǎn)存到只限應(yīng)用訪問的系統(tǒng)目錄內(nèi)的文件中。
3觅丰、AOT 編譯 (dex2oat) 守護(hù)進(jìn)程通過解析該文件來推進(jìn)其編譯饵溅。
JIT工作流程
-
分析信息會(huì)存儲(chǔ)在代碼緩存中,并會(huì)在內(nèi)存緊張時(shí)作為垃圾被回收妇萄。
無法保證在應(yīng)用處于后臺(tái)運(yùn)行狀態(tài)時(shí)所捕獲的快照能夠包含完整的數(shù)據(jù)(即 JIT 編譯的所有內(nèi)容)蜕企。
該過程不會(huì)嘗試確保記錄所有內(nèi)容(因?yàn)檫@將影響運(yùn)行時(shí)性能)。
-
方法可能有三種不同的狀態(tài):
- 已經(jīng)過解釋(dex 代碼)
- 已經(jīng)過 JIT 編譯
- 已經(jīng)過 AOT 編譯
如果同時(shí)存在 JIT 和 AOT 代碼(例如冠句,由于反復(fù)進(jìn)行逆優(yōu)化)轻掩,經(jīng)過 JIT 編譯的代碼將是首選代碼。
在不影響前臺(tái)應(yīng)用性能的情況下運(yùn)行 JIT 所需的內(nèi)存取決于相關(guān)應(yīng)用懦底。大型應(yīng)用比小型應(yīng)用需要更多內(nèi)存唇牧。一般來說,大型應(yīng)用所需的內(nèi)存穩(wěn)定維持在 4 MB 左右基茵。
周末和同學(xué)吃飯,得知Android面試問JVM,雖說Java 虛擬機(jī)(JVM)和Android虛擬機(jī)十分相似,但是完全驢頭不馬嘴根本不是同一個(gè)東西,說什么好呢 !盲目裝逼的問題該怎么回答 ?! 準(zhǔn)備抽時(shí)間總結(jié)下Android常識(shí)