Dalvik虛擬機器、Java虛擬機器與ART虛擬機器

YunSoul發表於2018-08-22

一、Java虛擬機器

1. Java的是Java位元組碼。

傳統的Java程式經過編譯,生成Java位元組碼儲存在class檔案中,Java虛擬機器通過解碼class檔案中的內容來執行程式。

2. Java虛擬機器基於棧架構。

程式在執行時虛擬機器需要頻繁的從棧上讀取或寫入資料,這個過程需要更多的指令分派與記憶體訪問次數,會耗費不少CPU時間。

二、Dalvik虛擬機器(Android 4.4以前)

1. Dalvik虛擬機器虛擬機器執行的是Dalvik位元組碼。

所有的Dalvik位元組碼由java位元組碼轉換而來,並被打包到一個DEX(Dalvik Executable)可執行檔案中,Dalvik虛擬機器通過解析DEX檔案來執行這些位元組碼。

2. Dalvik可執行檔案體積更小

Android SDK中的dx工具負責將Java位元組碼轉換為Dalvik位元組碼,並對Java類檔案重新排列,消除在類檔案中出現的所有冗餘資訊,從而減少了冗餘和重複的解析。

因為一般情況下,Java類檔案中包含多個不同的方法簽名,如果其他的類檔案引用改該類檔案的方法,方法簽名也會被複制到其類檔案中,也就是,多個不同的類會同時包含相同的方法簽名,同樣的,大量的字串常量在多個類檔案中也被重複使用。這些冗餘資訊會直接增加檔案的體積,也會嚴重影響虛擬機器解析檔案的效率。

3. Dalvik虛擬機器基於暫存器架構。

資料的訪問通過暫存器間直接傳遞,這樣的訪問方式比基於棧方式要快很多。

三、ART虛擬機器(Android 5.0後)

Dalvik虛擬機器是執行的時候編譯+執行,所以安裝速度比較快,但是開啟應用的時間較慢,應用佔用空間小。(以空間換時間)

ART虛擬機器是安裝的時候就編譯好,執行的時候就直接執行編譯好的程式碼,所以安裝速度比較慢,但是開啟應用的時間快,佔用空間較大。(以空間換時間)

apk包中除了一堆資源,還有一個重要檔案classes.dex,此檔案由java位元組碼優化打包而成,在Dalvik中,每次開啟應用的時候,Dalvik會讀取這個classes.dex並解釋執行;而在ART環境下,當安裝apk的時候,這個classes.dex檔案就會被轉換成本地機器碼——字尾為oat的檔案可直接供ART虛擬機器使用,以後開啟應用時直接讀取oat檔案執行即可。


#### YunSoul技術分享,掃碼關注微信公眾號##
    ——只要你學會了之前所不會的東西,只要今天的你強過了昨天的你,那你就一直是在進階的路上了。 Dalvik虛擬機器、Java虛擬機器與ART虛擬機器

相關文章