下载后可任意编辑Dalvik 虚拟机垃圾收集(GC)过程分析前面我们分析了 Dalvik 虚拟机堆的创建过程,以及 Java 对象在堆上的分配过程
这些知识都是理解 Dalvik 虚拟机垃圾收集过程的基础
垃圾收集是一个复杂的过程,它要将那些不再被引用的对象进行回收
一方面要求 Dalvik 虚拟机能够标记出哪些对象是不再被引用的
另一方面要求 Dalvik 虚拟机尽快地回收内存,避开应用程序长时间停顿
本文就将详细分析 Dalvik 虚拟机是如何解决上述问题完成垃圾收集过程的
Dalvik 虚拟机使用 Mark-Sweep 算法来进行垃圾收集
顾名思义,Mark-Sweep 算法就是为Mark 和 Sweep 两个阶段进行垃圾回收
其中,Mark 阶段从根集(Root Set)开始,递归地标记出当前所有被引用的对象,而 Sweep 阶段负责回收那些没有被引用的对象
在分析Dalvik 虚拟机使用的 Mark-Sweep 算法之前,我们先来了解一下什么情况下会触发 GC
Dalvik 虚拟机在三种情况下会触发四种类型的 GC
每一种类型 GC 使用一个 GcSpec结构体来描述,它的定义如下所示:[cpp] view plain copy 在 CODE 上查看代码片派生到我的代码片struct GcSpec { /* If true, only the application heap is threatened
*/ bool isPartial; /* If true, the trace is run concurrently with the mutator
*/ bool isConcurrent; /* Toggles for the soft reference clearing policy
*/ bool doPreserve; /* A name