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