博文

Understanding Garbage Collector in ART of Android

图片
大纲 前言 Mark-Sweep Collector Mark Stage Sweep Stage Finish Stage Semi-Space Collector 前言 ART 目前采取了垃圾追踪的回收策略,即若某个对象没有被引用,则被认为是可以回收的垃圾,释放垃圾占用的内存。 ART 实现了两种垃圾回收技术,一种是 Mark-Sweep, 另一种是 Semi-Space. Mark-Sweep :它的大致思想是,将所有的对象在内存中的位置记录在位图 A 中。然后,从所有对象的根出发,扫描根对象的所有引用,扫描根对象的所有引用的引用,一层层逐级扫描,直到叶子节点的对象。在这个逐级扫描的过程中,将涉及到的对象的位置都记录在位图 B 中。扫描结束后,对比两张位图 A 和 B :所有 A 中置位的位置,却没有 B 中被置位,被视为垃圾。并根据位图中的索引检索得到对象,然后释放该对象占用的内存。 Semi-Space : 它的特色是,有两个 space 空间,其中一个备用。另一个被系统拿来分配对象。在做垃圾扫描的时候,将所有在空间 A 中被有效引用的对象移动到空间 B 中。那么在空间 A 中剩余的对象就是垃圾了,直接释放垃圾对象所在的整个空间就可以了。这个回收速度很快。 Mark-Sweep Collector 要了解 Android 的垃圾回收策略,需要首先弄清楚对于每一个 Android 的 Heap ,有哪些 Space. 对于普通的 Android VM 进程来说,其 Heap 都是从 Zygote 继承过来。所以,每一个 VM 进程 Heap 的虚拟地址区间基本上都是一样的(区间的末端范围会有些不同)。对于一个普通的 VM 进程 Heap 的区间一般是这样划分的。 图 1.  Heap 中的空间 Image Space 的容量取决于 boot.art 和 boot.oat 的容量大小(具体可以到 /data/dalvik-cache/ 下查看这两个文件的大小)。在 Image Space 后面紧接着的就是 Zygote Space 。顾名思义,由于 Zygote 是所有 VM 进程的祖先,因此在普通的 VM 进程孵化出之前, Zygote 是需要一些 object 的

Understanding ROS Memory Allocator in ART Virtual Machine

图片
Agenda 1.   Run 基本结构 2.   主要算法 a)      Allocate b)      Free 正文 ROS memory allocator 是 Android ART virtual machine 中 GC 的一个内存分配器。 ROS 是 Run-of-Slots 的缩写。 在 ROS allocator 中,分配的都是虚拟地址区间(具体的物理内存什么时候分配是由 kernel 中的 page fault 来负责的)。 ROS allocator 的基本分配单元是 slot 。 slot大小 从 16Bytes 到 2048Bytes ,分别是 16,32,48,… n*16,512,1024,2048. 不同大小的 slot 对应不同种类的 Run ,换句话说,一种 Run 提供大小相同的 slot. 一共有 34 种 Run. 一 , Run 的基本结构 一个 Run, 可以分为两大部分,分别是 Run header 和 Data Area 。如下所示: Run header 里面包含了 ∙             Magic number: Debug 相关 ∙             Size_bracket_idx_: 表示了该 Run 中的 slot 的 size 是多大。比如 Size_bracket_idx_ 是 10 ,那么该 Run 中的 slot 的 size 是( 10+1 ) *16=176 Bytes. ∙             Is_thread_local: 表示了该 Run 是否是 Thread local area. ROS allocator 规定每个线程都会持有一组 Thread local Run ,该组 Run 的 slot size 最大为 176Bytes. 即,如果某个线程需要分配一个 space ,若该 space 不大于 176Bytes ,那么就从该线程的 Run 中获得虚拟内存,而不会从 ART runtime 中获取。 ∙             to_be_bulk_freed_: 该字段是一个 flag ,用来辅助处理一次释放多个对象的情况。若该标志置位,说明该 Run 有多个 slot