1、背景&問題
A、現(xiàn)今移動系統(tǒng)的內(nèi)存管理對用戶程序和用戶來說都不友好:
① 上層應(yīng)用程序以object為單位進(jìn)行內(nèi)存分配和回收,而底層內(nèi)核以page為粒度進(jìn)行內(nèi)存管理。這導(dǎo)致系統(tǒng)不了解應(yīng)用程序內(nèi)存使用情況,往往直接分配固定大小的內(nèi)存預(yù)算(heap)。而應(yīng)用程序?qū)嶋H工作集只占應(yīng)用程序被分配的heap大小的很小一部分,造成內(nèi)存資源的浪費(fèi);
② 當(dāng)內(nèi)存資源緊張時,系統(tǒng)會直接殺死應(yīng)用程序(lmkd),而重新啟動應(yīng)用程序需要很長時間,并且應(yīng)用程序并沒有積極使用被分配的內(nèi)存;
?
B、傳統(tǒng)的swap機(jī)制效果不好:
① 傳統(tǒng)的swap機(jī)制不適用于托管語言(比如,Java),因為這類語言運(yùn)行時的垃圾回收會導(dǎo)致額外的swap操作,讓工作集的估計變得困難;
② 傳統(tǒng)的按需swap無法滿足基于觸控響應(yīng)的移動設(shè)備,在內(nèi)存壓力下,會造成延時和卡頓;
基于以上分析,作者提出對移動系統(tǒng)來說,限制內(nèi)存管理改善的主要問題是底層系統(tǒng)缺少對上層系統(tǒng)語言運(yùn)行時(比如,Android Run Time,ART)的了解。
2、設(shè)計
本文提出一種新的內(nèi)存管理機(jī)制Marvin。Marvin的核心思想是結(jié)合Android系統(tǒng)內(nèi)核內(nèi)存管理機(jī)制和上層Java運(yùn)行時,重新設(shè)計針對移動系統(tǒng)的swap機(jī)制。
A、Marvin包括三個基本功能:以對象為粒度的工作集估計、提前進(jìn)行swap以及帶書簽的垃圾回收機(jī)制(Bookmarking garbage collector)。
以對象為粒度的工作集估計:
Marvin利用這個設(shè)計識別提前swap的候選并且將垃圾回收訪問與應(yīng)用程序訪問分離;由于缺乏硬件訪問位來幫助進(jìn)行跟蹤,Marvin實現(xiàn)ART 解釋器和編譯器中的軟件訪問跟蹤,因為現(xiàn)代移動語言運(yùn)行時同時運(yùn)行解釋代碼和編譯代碼。
提前進(jìn)行swap:
Marvin將磁盤交換與回收內(nèi)存分開,提前swap。根據(jù)不同object的狀態(tài),劃分兩類object:saved objects,已經(jīng)復(fù)制到磁盤,但仍然駐留在內(nèi)存中;reclaimed objects,不再駐留在內(nèi)存中,只存在于磁盤中。
帶書簽的垃圾回收機(jī)制:
垃圾回收器在遍歷對象堆以查找未使用的對象時可能會無意中在內(nèi)存中進(jìn)行換頁導(dǎo)致swap操作。Marvin 通過將修改后的書簽垃圾收集器集成到 Android 運(yùn)行時來解決這個問題
B、Marvin包括三個核心設(shè)計:存根(Stubs),相當(dāng)于對象之間的中間層;回收表,運(yùn)行時和底層系統(tǒng)進(jìn)行訪問協(xié)調(diào)swap工作;對象訪問干預(yù)(Object access interposition),使得系統(tǒng)在運(yùn)行時可以透明的采取行動。
對象引用間接存根:
Marvin 需要在相互引用的對象之間建立一個間接層,捕獲對換出對象(swapped-out)的訪問;存根提供該間接層,它是位于 Java 堆中小型偽對象,指向真實對象并且存儲真實對象引用的副本。
底層系統(tǒng)-運(yùn)行時協(xié)調(diào)的回收表:
Marvin 需要一種讓運(yùn)行時和操作系統(tǒng)協(xié)調(diào)的方法,告訴 OS 哪些對象可以被回收,防止操作系統(tǒng)回收運(yùn)行時正在使用的對象。同時共享內(nèi)存回收表允許這種協(xié)調(diào),存儲對象的位置和大小,并具有用于鎖定的元數(shù)據(jù)位。
對象訪問干預(yù):
當(dāng)應(yīng)用程序代碼訪問對象時,運(yùn)行時需要一種透明的方式恢復(fù)換出的對象并且更新工作集元數(shù)據(jù)。同時,對象訪問干預(yù)是通過一系列成對解釋器和編譯器的修改來實現(xiàn)的。具體來說,解釋器在執(zhí)行對象訪問時直接行動,編譯器圍繞對象訪問生成額外的 ARM64 指令。
C、Marvin三個基本功能的工作過程:
以對象為粒度的工作集估計:對對象設(shè)置訪問位;掃描訪問位;產(chǎn)生工作集(Marvin 在每個對象標(biāo)頭中保留四個字節(jié),并使用它們來存儲交換元數(shù)據(jù)和訪問位)。
設(shè)置訪問位
GC掃描訪問位,產(chǎn)生以對象為粒度的工作集
提前swap:將對象提前保存到外存;回收對象;恢復(fù)對象。
帶書簽的垃圾回收機(jī)制:運(yùn)行時使用對象訪問干預(yù)來維護(hù)存根引用;GC 在不接觸底層對象的情況下檢測存根和讀取引用。
3、實現(xiàn)
Marvin 有兩個關(guān)鍵組件:(1) Marvin 內(nèi)核 (MK),修改后的 Android/Linux 內(nèi)核(MK 的唯一職責(zé)是通過決定何時以及從哪個應(yīng)用程序回收內(nèi)存來平衡應(yīng)用程序之間的內(nèi)存分配。),以及 (2) Marvin Runtime (MRT),一種改進(jìn)的 ART(它執(zhí)行工作集估計、提前交換和書簽垃圾收集)。
4、實驗
A、實驗配置:Pixel XL phones,Android 7.1.1 (or our modified build)
B、性能指標(biāo):運(yùn)行App數(shù)量;提前swap的效率;開銷
Marvin 可以運(yùn)行的應(yīng)用程序數(shù)量是普通 Android 的 2 倍以上,同時在帶有 Linux swap 的 Android 上,少量分配會使應(yīng)用程序無法使用;
Marvin 回收內(nèi)存比帶 Linux swap 的 Android 快得多
5、總結(jié)
相比起之前優(yōu)化移動系統(tǒng)內(nèi)存管理(尤其是swap)的設(shè)計,Marvin的創(chuàng)新性在于結(jié)合上層高級語言運(yùn)行時和底層內(nèi)核對內(nèi)存管理優(yōu)化這一經(jīng)典問題提出針對性設(shè)計。盡管Marvin的具體設(shè)計取得文章所述的收益有待驗證,但作者發(fā)現(xiàn)的這一問題確實存在,即軟件運(yùn)行時和底層內(nèi)核運(yùn)行存在信息壁壘。通過設(shè)計合理的機(jī)制來解決這一問題,應(yīng)該能夠帶來系統(tǒng)性能的有效提升。
審核編輯:劉清
-
存儲器
+關(guān)注
關(guān)注
38文章
7484瀏覽量
163762 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209326 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
593瀏覽量
27392 -
SWAP
+關(guān)注
關(guān)注
0文章
51瀏覽量
12820 -
JAVA語言
+關(guān)注
關(guān)注
0文章
138瀏覽量
20090 -
ART
+關(guān)注
關(guān)注
0文章
26瀏覽量
10482
原文標(biāo)題:Marvin:語言運(yùn)行時和內(nèi)核協(xié)作讓我們的APP更快
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論