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