博文

目前显示的是 四月, 2014的博文

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