博文

目前显示的是标签为“ART”的博文

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...

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 Ru...