ART运行时垃圾收集(GC)过程分析ART运行时与Dalvik虚拟机一样,都使用了Mark-Sweep算法进行垃圾回收,因此它们的垃圾回收流程在总体上是一致的
但是ART运行时对堆的划分更加细致,因而在此基础上实现了更多样的回收策略
不同的策略有不同的回收力度,力度越大的回收策略,每次回收的内存就越多,并且它们都有各自的使用情景
这样就可以使得每次执行GC时,可以最大限度地减少应用程序停顿
本文就详细分析ART运行时的垃圾收集过程
ART运行时的垃圾收集收集过程如图1所示:图1的最上面三个箭头描述触发GC的三种情况,左边的流程图描述非并行GC的执行过程,右边的流程图描述并行GC的执行流程,接下来我们就详细图中涉及到的所有细节
在前面一文中,我们提到了两种可能会触发GC的情况
第一种情况是没有足够内存分配请求的分存时,会调用Heap类的成员函数CollectGarbageInternal触发一个原因为kGcCauseForAlloc的GC
第二种情况下分配出请求的内存之后,堆剩下的内存超过一定的阀值,就会调用Heap类的成员函数RequestConcurrentGC请求执行一个并行GC
Heap类的成员函数RequestConcurrentGC的实现如下所示:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片voidHeap::RequestConcurrentGC(Thread*self){//MakesurethatwecandoaconcurrentGC
Runtime*runtime=Runtime::Current();DCHECK(concurrent_gc_);if(runtime==NULL||
runtime->IsFinishedStarting()||
runtime->IsConcurrentGcEnabled()){retur