天天看點

Android中的ART和Dalvik對比

概述

之前也一直零零散散的看過Android運作時與Dalvik,但是都沒有沒有總結成文字,這裡總結一下幾篇相關部落格中的介紹。

維基百科:Dalvik虛拟機

維基百科:Android Runtime

Dalvik 是一個執行dex檔案的Java虛拟機

而ART則提供一套完全與Java虛拟機相容的接口,是以可以在4.4之後無縫将Dalvik替換成ART,這裡可以檢視:Android ART運作時無縫替換Dalvik虛拟機的過程分析

Dalvik與JVM

Dalvik是Android平台的虛拟機,在應用每次運作的時候會 将 dex檔案 編譯為 機器碼。
  • Dalvik使用.dex格式,而Java虛拟機使用的是class格式
  • 一個dex檔案可以包含若幹個類
  • Dalvik指令是基于寄存器的,Java虛拟機使用的指令集是基于堆棧的
  • 自Android 2.2開始,Dalvik支援JIT技術

Dalvik虛拟機的其它特性(Dalvik虛拟機簡要介紹和學習計劃)

Dalvik的記憶體管理

Dalvik虛拟機的記憶體大體上可以分為Java Object Heap、Bitmap Memory和Native Heap三種

Java Object Heap

  • Java Object Heap是用來配置設定Java對象,通過代碼new出來的對象都是位于Java Object Heap上的。
  • 可以通過ActivityManager類的成員函數getMemoryClass來獲得Dalvik虛拟機的Java Object Heap的最大值

Bitmap Memory

也稱為External Memory,HoneyComb之前,是用來處理圖像的,
  • Bitmap Memory是在Native Heap中配置設定的,但同樣計入Java Object Heap中。
  • 在HoneyComb以及更高的版本中,Bitmap Memory就直接是在Java Object Heap中配置設定了,可以直接接受GC的管理。
  • 因為Native Heap不受Java Object Heap的大小限制,是以處理大圖像時,容易抛出OutOfMemoryError。
  • 可通過android:largeHeap來通知Dalvik虛拟機應用程式需要使用較大的Java Object Heap,但不建議這麼做。

Native Heap

在Native Code中使用malloc等配置設定出來的記憶體
  • 不受Java Object Heap的大小限制,但會受到系統的限制,可以自由使用
  • 濫用Native Heap會導緻系統可用記憶體急劇減少,導緻系統采取激進的措施來Kill掉某些程序

Dalvik垃圾收集(GC)

在GingerBread之前,Dalvik虛拟使用的垃圾收集機制有以下特點:

  • Stop-the-world,也就是垃圾收集線程在執行的時候,其它的線程都停止;
  • Full heap collection,也就是一次收集完全部的垃圾;
  • 一次垃圾收集造成的程式中止時間通常都大于100ms。

在GingerBread以及更高的版本中,Dalvik虛拟使用的垃圾收集機制得到了改進,如下所示:

  • Cocurrent,也就是大多數情況下,垃圾收集線程與其它線程是并發執行的;
  • Partial collection,也就是一次可能隻收集一部分垃圾;
  • 一次垃圾收集造成的程式中止時間通常都小于5ms。

即時編譯(JIT)

Dalvik虛拟機從Android 2.2版本開始,才支援JIT,而且是可選的

本地調用JNI

  • JNI機制既支援在Java函數中調用C/C++函數,也支援在C/C++函數中調用Java函數

程序和線程管理

  • 每一個Android應用程式程序都有一個Dalvik虛拟機執行個體
  • 每一個Android應用程式程序都是由一種稱為Zygote的程序fork出來的

ART

是一種在Android作業系統上的運作環境,ART能夠在第一次安裝的時候,把應用程式的位元組碼轉換為機器碼。采用了預編譯(AOT,Ahead-Of-Time)技術。
  • ART運作的仍然是一個包含dex位元組碼的APK檔案;
  • AOT在在應用安裝的時候将應用的dex位元組碼翻譯成本地機器碼;

ART的優點

  • ART 性能高于采用JIT的Dalvik
  • 應用啟動更快、運作更快、體驗更流暢、觸感回報更及時
  • 更長的電池續航能力
  • 支援更低的硬體

ART的缺點

  • 位元組碼變為機器碼之後,占用的存儲空間更大
  • 應用的安裝時間會變長。

參考:

Android 中的Dalvik和ART是什麼,有啥差別?

Android運作時ART簡要介紹和學習計劃