天天看點

Dalvik虛拟機、ART虛拟機

Dalvik虛拟機

Dalvik虛拟機是Google區Android平台開發的虛拟機,它是Adnroid4.4以前的應用的解釋執行器。Dalvik虛拟機并不是Java虛拟機(JVM)的替代器。

Dalvik虛拟機與Java虛拟機最大的不同就是Dalvik是基于寄存器,而Java虛拟機是基于棧的。為什麼為這樣呢?首先,Java進階程式語言是為了跨平台而被設計出來的,在運作前需要通過編譯程式将Java代碼翻譯成中間代碼(位元組碼)來解釋執行。為了實作跨平台,生成的中間代碼就沒有使用寄存器,而是完全是靠堆棧來表示變量。而Dalvik一開始是為了運作在嵌入式裝置上,對性能比較看重,是以采用了寄存器來表示變量,沒有過多考慮跨平台的問題。

Dalvik采用了寄存器來表示變量後,JVM的位元組碼就無法使用了,于是Google就開了一套新的指令作為Dalvik虛拟機的中間代碼,是以Android使用Dex檔案格式來代替JVM的CLASS檔案。Dalvik來了支援寄存器表示變量,它的指令一條需要兩個位元組,而JVM隻需要一個位元組。Dalvik中使用的寄存器,一部被映射到arm的寄存器,另一部還是用堆棧在模拟。

Dex檔案格式作了如下改進:

  • 生成Dex檔案時,會把所有Class檔案整合到一個Dex檔案中,同時對所有類進行優化合并,去除備援的資訊,這樣既減少了檔案的大小,又提高了類的裝載速度
  • Dex檔案會把每個類檔案的常量池進行分解合并,最後放在一個常量池中,節約了記憶體的使用
  • Dex檔案中所有類推字元串常量也會被整理合并成一份
  • Dex檔案中的簽名隻有一份,驗證也隻有一次
  • Dalvik虛拟機為應用建立的線程都是Linux線程,通過Linux核心來管理線程,提高效率。

    垃圾回收算法一般有“标記并清理法”、“拷貝法”、”引用計數法“、"逐代回收法“。Dalvik虛拟機實作了”标記并清理法“、”拷貝法“兩種算法。Dalvik預設是使用“标記清理法”來進行垃圾清理。如果要使用“拷貝法”,則需要在編譯時指定編譯變量WITH_COPYING_GC為true。

“标記并清理法”:在對象配置設定時不加幹涉,會一直配置設定記憶體,直到達到上限,然後把所有無關的線程挂起,運作一個固定的垃圾回收線程回收記憶體。回收算法分為兩步:

1.給所有不需要回收的對象做标記

2.把所有未标記的對象釋放掉。

“标記并清理法”很好解決了“引用計數法“出現的”循環引用“問題,缺點是每次清理必須暫停正常的工作線程,而且回收處理的時間也比較長。暫停工作線程的原因是”标記并清理法“找到需要回收的對象需要周遊系統中所有對象來确定對象的使用情況,是以其他的工作線程必須先停止工作。

ART虛拟機

ART虛拟機相對Dalvik虛拟機而言,它的性能提升了很多,支援配置更低的裝置。但是ART虛拟機會比較消耗記憶體,因為ART編譯出來的檔案會比以前大10%~20%,而且安裝時間會Dalvik要長。因為應用會被編譯成可執行代碼,在下次執行是就不需要再解析和執行位元組碼了。

繼續閱讀