Dalvik 虛擬機(jī)
- Android4.4版本以前是Dalvik虛擬機(jī)
- Dalvik主要是完成對象生命周期管理,堆棧管理,線程管理,安全和異常管理,以及垃圾回收等等重要功能。
- Dalvik負(fù)責(zé)進(jìn)程隔離和線程管理,每一個Android應(yīng)用在底層都會對應(yīng)一個獨立的Dalvik虛擬機(jī)實例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行。
- 不同于Java虛擬機(jī)運(yùn)行java字節(jié)碼,Dalvik虛擬機(jī)運(yùn)行的是其專有的文件格式Dex
- dex文件格式可以減少整體文件尺寸,提高I/o操作的類查找速度。
- dex文件格式可以減少整體文件尺寸,提高I/o操作的類查找速度。
- odex是為了在運(yùn)行過程中進(jìn)一步提高性能,對dex文件的進(jìn)一步優(yōu)化。
- 有一個特殊的虛擬機(jī)進(jìn)程Zygote,他是虛擬機(jī)實例的孵化器。它在系統(tǒng)啟動的時候就會產(chǎn)生,它會完成虛擬機(jī)的初始化,庫的加載,預(yù)制類庫和初始化的操作。如果系統(tǒng)需要一個新的虛擬機(jī)實例,它會迅速復(fù)制自身,以最快的數(shù)據(jù)提供給系統(tǒng)。對于一些只讀的系統(tǒng)庫,所有虛擬機(jī)實例都和Zygote共享一塊內(nèi)存區(qū)域。
- 多個類被包含在一個.dex文件中
- GC的過程:這個回收動作和應(yīng)用程序非并發(fā)
- 所有線程就會掛起
- gc對符合條件的對象進(jìn)行標(biāo)記;
- gc對標(biāo)記的對象進(jìn)行回收;
- 恢復(fù)所有線程的執(zhí)行現(xiàn)場繼續(xù)運(yùn)行。
- dalvik這么做的好處是,當(dāng)pause了之后,GC勢必是相當(dāng)快速的。但是如果出現(xiàn)GC頻繁并且內(nèi)存吃緊勢必會導(dǎo)致UI卡頓、掉幀、操作不流暢等。
ART 虛擬機(jī)
- 4.4版本開始引入ART虛擬機(jī)(Android Runtime)。在4.4版本上,兩種運(yùn)行時環(huán)境共存,可以相互切換,但是在5.0版本以后,Dalvik虛擬機(jī)則被徹底的丟棄,全部采用ART
- ART GC過程:
- GC將會鎖住Java堆,掃描并進(jìn)行標(biāo)記;
- 標(biāo)記完畢釋放掉Java堆的鎖,并且掛起所有線程;
- GC對標(biāo)記的對象進(jìn)行回收;
- 恢復(fù)所有線程的執(zhí)行現(xiàn)場繼續(xù)運(yùn)行;
- 相對于dalvik的優(yōu)勢:主要的改善點在將其非并發(fā)過程改成了部分并發(fā),還有就是對內(nèi)存的重新分配管理。
- 它將Java分了一塊空間命名為Large-Object-Space,這塊內(nèi)存空間的引入用來專門存放large object。同時ART又引入了moving collector的技術(shù),即將不連續(xù)的物理內(nèi)存塊進(jìn)行對齊。對齊了后內(nèi)存碎片化就得到了很好的解決。Large-Object-Space的引入是因為moving collector對大塊內(nèi)存的位移時間成本太高