1、背景&问题
A、现今移动系统的内存管理对用户程序和用户来说都不友好:
① 上层应用程序以object为单位进行内存分配和回收,而底层内核以page为粒度进行内存管理。这导致系统不了解应用程序内存使用情况,往往直接分配固定大小的内存预算(heap)。而应用程序实际工作集只占应用程序被分配的heap大小的很小一部分,造成内存资源的浪费;
② 当内存资源紧张时,系统会直接杀死应用程序(lmkd),而重新启动应用程序需要很长时间,并且应用程序并没有积极使用被分配的内存;
B、传统的swap机制效果不好:
① 传统的swap机制不适用于托管语言(比如,Java),因为这类语言运行时的垃圾回收会导致额外的swap操作,让工作集的估计变得困难;
② 传统的按需swap无法满足基于触控响应的移动设备,在内存压力下,会造成延时和卡顿;
基于以上分析,作者提出对移动系统来说,限制内存管理改善的主要问题是底层系统缺少对上层系统语言运行时(比如,Android Run Time,ART)的了解。
2、设计
本文提出一种新的内存管理机制Marvin。Marvin的核心思想是结合Android系统内核内存管理机制和上层Java运行时,重新设计针对移动系统的swap机制。
A、Marvin包括三个基本功能:以对象为粒度的工作集估计、提前进行swap以及带书签的垃圾回收机制(Bookmarking garbage collector)。
以对象为粒度的工作集估计:
Marvin利用这个设计识别提前swap的候选并且将垃圾回收访问与应用程序访问分离;由于缺乏硬件访问位来帮助进行跟踪,Marvin实现ART 解释器和编译器中的软件访问跟踪,因为现代移动语言运行时同时运行解释代码和编译代码。
提前进行swap:
Marvin将磁盘交换与回收内存分开,提前swap。根据不同object的状态,划分两类object:saved objects,已经复制到磁盘,但仍然驻留在内存中;reclaimed objects,不再驻留在内存中,只存在于磁盘中。
带书签的垃圾回收机制:
垃圾回收器在遍历对象堆以查找未使用的对象时可能会无意中在内存中进行换页导致swap操作。Marvin 通过将修改后的书签垃圾收集器集成到 Android 运行时来解决这个问题
B、Marvin包括三个核心设计:存根(Stubs),相当于对象之间的中间层;回收表,运行时和底层系统进行访问协调swap工作;对象访问干预(Object access interposition),使得系统在运行时可以透明的采取行动。
对象引用间接存根:
Marvin 需要在相互引用的对象之间建立一个间接层,捕获对换出对象(swapped-out)的访问;存根提供该间接层,它是位于 Java 堆中小型伪对象,指向真实对象并且存储真实对象引用的副本。
底层系统-运行时协调的回收表:
Marvin 需要一种让运行时和操作系统协调的方法,告诉 OS 哪些对象可以被回收,防止操作系统回收运行时正在使用的对象。同时共享内存回收表允许这种协调,存储对象的位置和大小,并具有用于锁定的元数据位。
对象访问干预:
当应用程序代码访问对象时,运行时需要一种透明的方式恢复换出的对象并且更新工作集元数据。同时,对象访问干预是通过一系列成对解释器和编译器的修改来实现的。具体来说,解释器在执行对象访问时直接行动,编译器围绕对象访问生成额外的 ARM64 指令。
C、Marvin三个基本功能的工作过程:
以对象为粒度的工作集估计:对对象设置访问位;扫描访问位;产生工作集(Marvin 在每个对象标头中保留四个字节,并使用它们来存储交换元数据和访问位)。
设置访问位
GC扫描访问位,产生以对象为粒度的工作集
提前swap:将对象提前保存到外存;回收对象;恢复对象。
带书签的垃圾回收机制:运行时使用对象访问干预来维护存根引用;GC 在不接触底层对象的情况下检测存根和读取引用。
3、实现
Marvin 有两个关键组件:(1) Marvin 内核 (MK),修改后的 Android/Linux 内核(MK 的唯一职责是通过决定何时以及从哪个应用程序回收内存来平衡应用程序之间的内存分配。),以及 (2) Marvin Runtime (MRT),一种改进的 ART(它执行工作集估计、提前交换和书签垃圾收集)。
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、总结
相比起之前优化移动系统内存管理(尤其是swap)的设计,Marvin的创新性在于结合上层高级语言运行时和底层内核对内存管理优化这一经典问题提出针对性设计。尽管Marvin的具体设计取得文章所述的收益有待验证,但作者发现的这一问题确实存在,即软件运行时和底层内核运行存在信息壁垒。通过设计合理的机制来解决这一问题,应该能够带来系统性能的有效提升。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !