下载后可任意编辑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 for this garbage collection mode. */ const char *reason; }; 这个结构体定义在文件 dalvik/vm/alloc/Heap.h 中。 GcSpec 结构体的各个成员变量的含义如下所示: isPartial: 为 true 时,表示仅仅回收 Active 堆的垃圾;为 false 时,表示同时回收 Active堆和 Zygote 堆的垃圾。 isConcurrent: 为 true 时,表示执行并行 GC;为 false 时,表示执行非并行 GC。 doPreserve: 为 true 时,表示在执行 GC 的过程中,不回收软引用引用的对象;为 false时,表示在执行 GC 的过程中,回收软引用引用的对象。 reason: 一个描述性的字符串。 Davlik 虚拟机定义了四种类的 GC,如下所示:[cpp] view plain copy 在 CODE 上查看代码片派生到我的代码片下载后可任意编辑/* Not enough space for an "ordinary" Object to be allocated. */ extern c...