亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

Dalvik 虛擬機(jī)

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

Dalvik誕生消亡史

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

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

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

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

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

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

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

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

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

  • 每次重新啟動(dòng)引用都需要重新編譯
  • 運(yùn)行時(shí)比較耗電

什么是dex

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

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

什么是odex

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

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

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

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

ART 虛擬機(jī)

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

什么是AOT(Ahead-Of-Time

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

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

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

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

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

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

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

ART時(shí)間線

  • Android 4.4 ,ART和Dalvik是共存的,用戶可以在兩者之間進(jìn)行選擇。
  • Android 5.0,正式取代Dalvik虛擬機(jī)成為Android虛擬機(jī)運(yùn)行環(huán)境,Dalvik退出歷史舞臺(tái),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對(duì)垃圾收集器進(jìn)行了改進(jìn)優(yōu)化,提高了吞吐量。

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

相關(guān)文章

最新評(píng)論