一、什么是Dalvik虛擬機
Dalvik是Google為Android平臺設(shè)計的Java虛擬機,是Android平臺的重要組成部分,支持dex格式的Java程序運行。dex格式是專門為Dalvik設(shè)計的一種壓縮格式,適合內(nèi)存和處理器速度有限的系統(tǒng)。
Dalvik虛擬機主要負責完成對象生命周期管理,堆棧管理、線程管理、安全和異常管理,以及垃圾回收等等。Dalvik早期并沒有JIT編譯器,知道Android2.2才加入對JIT的技術(shù)支持。
2、Dalvik的特點
- 體積小、占用內(nèi)存小
- 專有dex可執(zhí)行文件格式,體積更小,執(zhí)行速度更快
- 常量池采用32位索引值,尋找類方法名、字段名、常量更快
- 基于寄存器架構(gòu),擁有一套完整的指令系統(tǒng)
- 提供對象生命周期管理,堆棧管理、線程管理、安全和異常管理,以及垃圾回收等重要功能
- Android程序都運行在Android系統(tǒng)進程中,每一個進程對應(yīng)一個Dalvik虛擬機實例
3、Dalvik虛擬機跟Java虛擬機的區(qū)別
Java虛擬機運行的是Java字節(jié)碼,Dalvik虛擬機運行是Dalvik字節(jié)碼。Java程序通過編譯生成.class文件,Java虛擬機通過解碼.class文件內(nèi)容來運行程序;Dalvik字節(jié)碼是由Java字節(jié)碼轉(zhuǎn)化來的,并打包到.dex可執(zhí)行文件中,Dalvik虛擬機通過解釋.dex文件來執(zhí)行程序。Dalvik可執(zhí)行文件體積小。Android SDK中有一個叫dx的工具負責將Java字節(jié)碼轉(zhuǎn)換為Dalvik字節(jié)碼。dx工具會對Java類文件重新排序,消除其中的冗余信息,重新組合形成一個常量池,所有類文件共享一個常量池。由于dx工具對常量池的壓縮,使得相同的字符串,常量在DEX文件中只出現(xiàn)一次,從而減小了文件的體積。Java虛擬機基于棧架構(gòu),Dalvik虛擬機基于寄存器架構(gòu)。
4、什么是ART虛擬機
ART 代表
Android Runtime,其處理應(yīng)用程序方式不同于Dalvik,Dalvik是依靠一個Just-In-Time (JIT)編譯器去解釋字節(jié)碼。開發(fā)者編譯后的應(yīng)用代碼需要通過一個解釋器在用戶的設(shè)備上運行,這一機制并不高效,但讓應(yīng)用能更容易在不同硬件和架構(gòu)上運 行。ART則完全改變了這套做法,在應(yīng)用安裝時就預編譯字節(jié)碼到機器語言,這一機制叫Ahead-Of-Time (AOT)編譯。在移除解釋代碼這一過程后,應(yīng)用程序執(zhí)行將更有效率,啟動更快。
ART的優(yōu)點
- 1、系統(tǒng)性能的顯著提升。
- 2、應(yīng)用啟動更快、運行更快、體驗更流暢、觸感反饋更及時。
- 3、更長的電池續(xù)航能力。
- 4、支持更低的硬件。
ART的缺點
- 1、更大的存儲空間占用,可能會增加10%-20%。
- 2、更長的應(yīng)用安裝時間。
5、Dalvik和ART虛擬機的區(qū)別:
1、垃圾回收機制
Dalvik的GC的過程.主要有有四個過程:
1、當gc被觸發(fā)時候,其會去查找所有活動的對象,這個時候整個程序與虛擬機內(nèi)部的所有線程就會掛起,這樣目的是在較少的堆棧里找到所引用的對象.需要注意的是這個回收動作和應(yīng)用程序非并發(fā)。
2、gc對符合條件的對象進行標記
3、gc對標記的對象進行回收
4、恢復所有線程的執(zhí)行現(xiàn)場繼續(xù)運行
dalvik這么做的好處是,當pause了之后,GC勢必是相當快速的.但是如果出現(xiàn)GC頻繁并且內(nèi)存吃緊勢必會導致UI卡頓,掉幀.操作不流暢等。
ART改善了這種GC方式 , 主要的改善點在將其非并發(fā)過程改變成了部分并發(fā)。
當ART GC發(fā)生時:
1、GC將會鎖住Java堆,掃描并進行標記
2、標記完畢釋放掉Java堆的鎖,并且掛起所有線程
3、GC對標記的對象進行回收
4、恢復所有線程的執(zhí)行現(xiàn)場繼續(xù)運行
5、重復2-4直到結(jié)束
可以看出整個過程做到了部分并發(fā)使得時間縮短.據(jù)官方測試數(shù)據(jù)說gc效率提高2倍
2、內(nèi)存管理
Dalvik內(nèi)存管理的特點:內(nèi)存碎片化嚴重,Mark and Sweep算法帶來的弊端,每次GC后內(nèi)存千瘡百孔,本來連續(xù)分配的內(nèi)存變得碎片化嚴重,之后再分配對象內(nèi)存地址變得困難
ART的解決:在art中,它將Java分了一塊空間命名為Large-object-space,這塊內(nèi)存空間引入用來專門存放large-object。同時ART又引入了moving collector的技術(shù),即將不連續(xù)的物理內(nèi)存塊進行對齊.對齊了后內(nèi)存碎片化就得到了很好的解決.Large-Object-Space的引入一是因為moving collector對大塊內(nèi)存的位移時間成本太高,而且提高內(nèi)存的利用率。根官方統(tǒng)計,ART的內(nèi)存利用率提高10倍了左右。