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
有条件地允许程序的其他线程执行
分为两个阶段:
- 只负责标记根集对象(GC开始的瞬间给,被全局变量、栈变量和寄存器等引用的对象): Stop The World
- 顺着已标记的根集对象找到其余的被引用的变量: 允许除垃圾收集线程以外的线程运行,但是需要由Card Table(一字节CLEAN/DIRTY)记录在该过程中被修改的对象(非垃圾收集堆对象 对 垃圾收集堆对象 的引用 -> 由于 Dalvik虚拟机进行部分垃圾收集时,只收集Activie堆上分配的对象 -> Zygote堆上分配的对象 在 部分垃圾收集执行过程中 对 在 Active堆上分配的对象的引用)
2. Sweep阶段
回收没有被标记的对象占用的内存
Android GC
https://blog.dreamtobe.cn/2015/11/30/gc/