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 是需要一些 obje...