dalvik
在Android 4.4包括4.4以前都是使用的dalvik虛擬機(4.4的時候放出了art的測試版本,從5.0開始正式使用art虛擬機)
dalvik從android開始使用jit(just-in-time)即時編譯,就是什么時候用什么時候編譯,也就是說app在運行的過程中,dalvik在不斷的進行編譯,比如說接下去要打開這個activity,dalvik會把相關的字節碼再轉換成機器碼。
每一個Android應用的底層都運行著一個dalvik虛擬機
dalvik支持的是.dex文件的運行,會將dex文件經過優化生成odex文件然后在虛擬機上進行運行,優化的過程可能發生在安裝應用時,也可能發生在應用運行時
一般的編譯器都是基于堆棧的,但是dalvik是基于寄存器的。基于堆棧的編譯器一般會是用大量指令,而基于寄存器的編譯器的指令會比較長
art (Android runtime)
使用的aot(ahead-of-time)預編譯技術,在應用安裝之前,art就已經把所有的字節碼全部編譯成了機器碼。所以相比較而言,art在安裝的過程中會比dalvik花費更多的時間且占用更多的內部存儲空間,但是在應用運行的過程中卻流暢的多,高效又省電。
art依然支持dex文件,將dex文件編譯成ELF文件然后在虛擬機上運行
相比較而言,art在垃圾回收,性能問題上都有顯著的提升
回收算法的比較
dalvik
大部分主流的dalvik都是采用的標記回收算法(把沒有被直接或者間接引用的對象都標記起來等待回收,但是可能會出現較多的內存碎片,因此會由于內存碎片導致的內存依然吃緊再次觸發GC),但是也有采用拷貝算法的(生成兩塊內存區,每次只在其中一塊跑,當需要回收的時候,把一塊里面用到的都復制到另外一塊中去,然后把這一塊完全回收)。
很明顯的,dalvik的內存回收算法還是有很大的提高空間的。
art
art中會專門開辟大內存空間,art中會把java堆分成專門存放預加載的空間、跟之前dalvik相同作用的控件和大內存空間。大內存空間我們專門用來存放一些占用內存比較大對象的,比方說bitmap。因為大內存的對象通常會造成比較頻繁的GC,那么這么一來就大大提高了回收效率。
并且art還支持并發GC,我們知道GC觸發的時候所有都會暫停,那么它的什么時候完成會極大的影響用戶的體驗,并發GC會將暫停的時間極大縮小,讓GC卡頓的可能變得更小。
并且art在后臺還會有專門的優化算法,做內存整理,減少內存碎片,以及上面講到的內存分配的時候的大內存分配,內存分配效率也大大提高了。