欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android虛擬機(jī)Dalvik和ART科普

 更新時間:2023年01月18日 11:43:08   作者:小宏快跑  
這篇文章主要為大家介紹了Android虛擬機(jī)Dalvik和ART科普詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

雖然Android程序是使用Java語言開發(fā)的,當(dāng)然,現(xiàn)在也可以使用kotlin語言。但是實際上我們開發(fā)出來的Android程序并不能運行在JVM上,而是只能運行在一個類似JVM的Android虛擬機(jī)上。Android虛擬機(jī)有兩種,分別是Dalvik虛擬機(jī)ART虛擬機(jī)

Dalvik 虛擬機(jī)

Dalvik虛擬機(jī)是Google自己設(shè)計的用于Android平臺的虛擬機(jī),它曾經(jīng)是Android平臺的核心組成部分之一。它負(fù)責(zé)加載dex/odex文件并解析成機(jī)器碼然后執(zhí)行。Dalvik虛擬機(jī)并沒有遵循《Java虛擬機(jī)規(guī)范》,因此不能算是Java虛擬機(jī)。但是它與Java卻又有聯(lián)系,它執(zhí)行的DEX文件是通過Class文件轉(zhuǎn)化而來。我們也可以認(rèn)為它是為了能在安卓設(shè)備運行而對JVM進(jìn)行優(yōu)化的產(chǎn)物

Dalvik誕生消亡史

  • Android 1.0,使用Dalvik作為Android虛擬機(jī)運行環(huán)境。
  • Android 2.2,Google在Andriod虛擬機(jī)中加入了JIT編譯器(Just-In-Time Compiler)。
  • Android 4.4,Google帶來了全新的虛擬機(jī)運行環(huán)境ART,此時ART和Dalvik是共存的,用戶可以在兩者之間進(jìn)行選擇。
  • Android 5.0,ART全面取代了Dalvik成為了Android虛擬機(jī)運行環(huán)境,至此Dalvik退出歷史舞臺。

Dalvik 特點 (與JVM的區(qū)別)

  • Dalvik虛擬機(jī)運行的是Dalvik字節(jié)碼,Dalvik字節(jié)碼由Java字節(jié)碼轉(zhuǎn)換而來,并被打包到一個dex文件中。而JVM運行的是class文件或jar文件。
  • 加載速度快,dex相比于Jar文件會把所有包含的信息整合在一起,減少了冗余信息。這樣就減少I/O操作,提高類的查找速度。
  • Dalvik虛擬機(jī)是基于寄存器,而JVM是基于棧(操作數(shù)棧)。雖然基于寄存器執(zhí)行效率好,但是可移植性差,難跨平臺。
  • Dalvik虛擬機(jī)允許在有限的內(nèi)存中同時運行多個進(jìn)程,每一個應(yīng)用都運行在一個Dalvik虛擬機(jī)實例中,擁有獨立的進(jìn)程空間。
  • Dalvik虛擬機(jī)有共享機(jī)制,不同應(yīng)用之間在運行時可以共享相同的類,擁有更高的效率。

什么是JIT(Just-In-Time Compiler)

早期沒有JIT的時候,虛擬機(jī)運行時,會通過解釋器來解釋字節(jié)碼并將其翻譯為機(jī)器碼,逐條讀入,逐條翻譯,最后再執(zhí)行,這樣就比較慢,效率不高。針對上面這個問題,引進(jìn)了JIT(即時編譯器)技術(shù)。它是一種優(yōu)化手段。

JIT技術(shù)簡單來說就是將解釋過的機(jī)器碼緩存起來,下次再執(zhí)行時到這個方法的時候,則直接從緩存里面取出機(jī)器碼來執(zhí)行。減少了讀取字節(jié)碼和翻譯字節(jié)碼的操作。以此來提高效率。JIT技術(shù)的引入使得Dalvik的性能提升了3~6倍

不過要注意的是并不是所有執(zhí)行過的代碼對應(yīng)的機(jī)器碼都會被緩存起來。而是只有被認(rèn)定為熱點代碼(Hot Spot Code) 的代碼才會。這里所指的熱點代碼主要有兩類,包括:

  • 被多次調(diào)用的方法
  • 被多次執(zhí)行的循環(huán)體(雖然只是循環(huán)體被多次執(zhí)行,但仍是將整個方法的機(jī)器碼緩存起來)

JIT技術(shù)雖好,但是也是有缺點的:

  • 每次重新啟動引用都需要重新編譯
  • 運行時比較耗電

什么是dex

dex是二進(jìn)制文件,用于在Android虛擬機(jī)上執(zhí)行。是通過把所有的class文件進(jìn)行合并優(yōu)化得到的。dex文件去除了class文件中的冗余信息(比如重復(fù)字符串),并且結(jié)構(gòu)更加緊湊,因此在dex解析階段可以減少I/O操作,提高類查找速度。

它與.jar文件不同,.jar文件像是一個文件夾,里面的.class是單獨的文件,各個class信息里面會出現(xiàn)重復(fù)的信息。而dex文件,則將所有的.class里面的信息整合在一起,去除掉里面的重復(fù)數(shù)據(jù)。

什么是odex

odex是從apk提取出dex文件并通過優(yōu)化后得到的產(chǎn)物,它被保存到data/dalvik-cache目錄下。原apk文件中的classes.dex可以保留也可以刪除,甚至有時候會留下殘缺的dex文件。

系統(tǒng)在首次啟動時,需要對預(yù)置的apk進(jìn)行安裝,此時需要將dex從apk文件中解壓出來放到data/app文件夾中。

  • 在Dalvik虛擬機(jī)中,會通過dexopt來對dex進(jìn)行優(yōu)化,生成odex文件,并將其保存到手機(jī)的VM緩存文件夾data/dalvik-cache下(注意,這邊生成的odex文件后綴依然是dex )。它是一個dey文件,里面仍然還是字節(jié)碼。
  • 在ART虛擬機(jī)上,同樣會在首次進(jìn)入系統(tǒng)的時候使用dexopt工具來對dex進(jìn)行優(yōu)化,不過此時的優(yōu)化是將dex字節(jié)碼翻譯成本地機(jī)器碼。并保存在data/dalvik-cache下。

一般情況下,在Android系統(tǒng)進(jìn)行編譯的時候,預(yù)處理提取Odex文件的話,將會大大優(yōu)化系統(tǒng)首次啟動時間。

ART 虛擬機(jī)

ART虛擬機(jī)在Android 5.0開始替換Dalvik虛擬機(jī)。其處理應(yīng)用程序執(zhí)行的方式不同于Dalvik虛擬機(jī),它不使用JIT而是使用了AOT(Ahead-Of-Time),也就是提前編譯技術(shù)。并且對垃圾收集器也進(jìn)行了改進(jìn)和優(yōu)化,當(dāng)然也還包括了其他的優(yōu)化。

什么是AOT(Ahead-Of-Time

AOT也就是提前編譯技術(shù)。簡單來說就是提前將字節(jié)碼轉(zhuǎn)換成本地機(jī)器碼,然后存儲在本地磁盤上,運行時可以直接執(zhí)行,避免了Dalvik時期的應(yīng)用運行時再來解釋字節(jié)碼。運行時效率大大提高。

在Android 7.0 之前,Android系統(tǒng)安裝應(yīng)用的時候,會進(jìn)行一次預(yù)編譯,將字節(jié)碼預(yù)先編譯成本地機(jī)器碼,生成.oat文件,并存儲在本地磁盤上,也就是AOT技術(shù)。這樣在應(yīng)用每次運行時就不需要重新編譯,可以直接使用編譯好本地機(jī)器碼,運行效率大大提升。但是這也使得安裝應(yīng)用的時間大大增加,

于是在Android7.0,又重新引進(jìn)了JIT技術(shù),形成JIT/AOT混合編譯模式,這種混合編譯的特點是:

  • 應(yīng)用在安裝的時候,不進(jìn)行AOT預(yù)編譯。
  • 應(yīng)用運行時這直接通過解釋器翻譯字節(jié)碼為機(jī)器碼然后執(zhí)行。并同時記錄熱點代碼信息到profile文件中。
  • 手機(jī)進(jìn)入空閑或充電狀態(tài)的時候,系統(tǒng)會掃描APP目錄下的profile文件,并通過AOT對熱點代碼進(jìn)行編譯。
  • 下一次啟動時,會根據(jù)profile文件來運行已編譯好的機(jī)器碼,避免在運行時對已經(jīng)變過的方法又進(jìn)行了JIT編譯。
  • 應(yīng)用運行期間會持續(xù)對熱點代碼進(jìn)行記錄,以方便在空閑或充電時進(jìn)行AOT,以此循環(huán)。

使用了JIT來對AOT進(jìn)行補充,可以提升運行時性能,節(jié)省存儲空間,加快應(yīng)用運行速度。 具體可以查看google官方文檔:實現(xiàn) ART 即時 (JIT) 編譯器

ART垃圾收集器優(yōu)化

  • 只有一次GC暫停(Dalvik需要兩次)
  • 并發(fā)復(fù)制,可減少后臺內(nèi)存使用和碎片
  • GC暫停的時間不受堆大小影響
  • 在清理最近分配的短時對象這種特殊情況中,回收器的總GC時間更短
  • 優(yōu)化了垃圾回收的工效,能夠更加及時地進(jìn)行并行垃圾回收,這使得GC_FOR_ALLOC事件在典型用例中極為罕見

ART時間線

  • Android 4.4 ,ART和Dalvik是共存的,用戶可以在兩者之間進(jìn)行選擇。
  • Android 5.0,正式取代Dalvik虛擬機(jī)成為Android虛擬機(jī)運行環(huán)境,Dalvik退出歷史舞臺,AOT取代JIT。
  • Android 7.0,JIT回歸,采用JIT和AOP混合編譯模式。
  • ART持續(xù)更新優(yōu)化

Dalvik VM 和 ART VM 有什么區(qū)別

  • ART早期使用AOT技術(shù),后期使用AOT+JIT混合,而Dalvik使用JIT
  • ART支持64位CPU并兼容32位CPU,而Dalvik只支持32位CPU
  • ART對垃圾收集器進(jìn)行了改進(jìn)優(yōu)化,提高了吞吐量。

以上就是Android虛擬機(jī)Dalvik和ART科普及使用的詳細(xì)內(nèi)容,更多關(guān)于Android虛擬機(jī)Dalvik ART的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論