Android GC

本文最后更新于:2017年4月24日 凌晨

Dalvik的GC与ART运行时GC采用同一套机制

Heap分布

Heap名分布内容
Activity Heap第一个应用程序fork前,未使用的部分第一个应用fork开始后,无论是Zygote进程,还是应用进程,分配的对象
Zygote Heap第一个应用程序fork前,已经使用的部分Zygote进程在启动过程中加载的类、资源、对象

资源回收:

Dalvik虚拟机中的堆:

匿名共享内存

不直接管理,封装成mspace交给C库来管理

Heap Bitmap:

描述对象有没有被引用的数据结构

Mark-Sweep算法

1. Mark阶段

从对象的根集开始标记被引用的对象

一般算法

Stop The World

除垃圾收集线程之外,其他线程都停止,否则可能导致不能正确标记每一个对象

并行垃圾收集算法

Concurrent GC
有条件地允许程序的其他线程执行

分为两个阶段:

  1. 只负责标记根集对象(GC开始的瞬间给,被全局变量、栈变量和寄存器等引用的对象): Stop The World
  2. 顺着已标记的根集对象找到其余的被引用的变量: 允许除垃圾收集线程以外的线程运行,但是需要由Card Table(一字节CLEAN/DIRTY)记录在该过程中被修改的对象(非垃圾收集堆对象 对 垃圾收集堆对象 的引用 -> 由于 Dalvik虚拟机进行部分垃圾收集时,只收集Activie堆上分配的对象 -> Zygote堆上分配的对象 在 部分垃圾收集执行过程中 对 在 Active堆上分配的对象的引用)

2. Sweep阶段

回收没有被标记的对象占用的内存




Android GC
https://blog.dreamtobe.cn/2015/11/30/gc/
作者
Jacksgong
发布于
2015年11月30日
更新于
2017年4月24日
许可协议