Dalvik虚拟机垃圾收集(GC)过程分析前面我们分析了Dalvik虚拟机堆的创建过程,以及Java对象在堆上的分配过程
这些知识都是理解Dalvik虚拟机垃圾收集过程的基础
垃圾收集是一个复杂的过程,它要将那些不再被引用的对象进行回收
一方面要求Dalvik虚拟机能够标记出哪些对象是不再被引用的
另一方面要求Dalvik虚拟机尽快地回收内存,避免应用程序长时间停顿
本文就将详细分析Dalvik虚拟机是如何解决上述问题完成垃圾收集过程的
Dalvik虚拟机使用Mark-Sweep算法来进行垃圾收集
顾名思义,Mark-Sweep算法就是为Mark和Sweep两个阶段进行垃圾回收
其中,Mark阶段从根集(RootSet)开始,递归地标记出当前所有被引用的对象,而Sweep阶段负责回收那些没有被引用的对象
在分析Dalvik虚拟机使用的Mark-Sweep算法之前,我们先来了解一下什么情况下会触发GC
Dalvik虚拟机在三种情况下会触发四种类型的GC
每一种类型GC使用一个GcSpec结构体来描述,它的定义如下所示:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片structGcSpec{/*Iftrue,onlytheapplicationheapisthreatened
*/boolisPartial;/*Iftrue,thetraceisrunconcurrentlywiththemutator
*/boolisConcurrent;/*Togglesforthesoftreferenceclearingpolicy
*/booldoPreserve;/*Anameforthisgarbagecollectionmode
*/constchar*reason;};这个结构体定义在文件dalvik/vm/alloc/Heap
GcSpec