概述
之前也一直零零散散的看過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簡要介紹和學習計劃