文档详情

ART运行时Mark-Compact(MC)GC执行过程分析解析.doc

发布:2017-01-07约3.69万字共22页下载文档
文本预览下载声明
ART运行时Mark-Compact( MC)GC执行过程分析 除了Semi-Space(SS)GC和Generational Semi-Space(GSS)GC,ART运行时还引入了第三种Compacting GC:Mark-Compact(MC)GC。这三种GC虽然都是Compacting GC,不过它们的实现方式却有很大不同。SS GC和GSS GC需两个Space来压缩内存,而MC GC只需一个Space来压缩内存。本文就详细分析MC GC的执行过程。 从前面一文可以知道,Mark-Compact GC主要是针对ART运行时正在使用的Bump Pointer Space进行压缩,如图1所示: 从图1可以看出,当Mark-Compact GC执行完成之后,原来位于Bump Pointer Space上的仍然存活的对象会被依次移动至原Bump Pointer Space的左侧,并且按地址从小到大紧凑地排列在一起。这个过程不需要借助于额外的Space来完成。这一点是Mark-Compact GC与Semi-Space GC、Generational Semi-Space GC的显著区别。 不过,Mark-Compact GC与Semi-Space GC、Generational Semi-Space GC一样,除了需要对ART运行时当前使用的Bump Pointer Space进行内在压缩之外,还需要修改其它Space对Bump Pointer Space的引用,因为Bump Pointer Space的对象发生了移动。此外,ART运行时堆的Non Moving Space和Large Object Space也会进行像Mark-Sweep GC一样的垃圾回收。 从前面一文还可以知道,在ART运行时内部,所有的GC都是通过Heap类的成员函数CollectGarbageInternal开始执行的,并且当决定要执行Mark-Compact GC时,最终会以MarkCompact类的成员函数RunPhases作为入口点,如下所示: [cpp] view plain copy void MarkCompact::RunPhases() { Thread* self = Thread::Current(); InitializePhase(); CHECK(!Locks::mutator_lock_-IsExclusiveHeld(self)); { ScopedPause pause(this); MarkingPhase(); ReclaimPhase(); } FinishPhase(); } 这个函数定义在文件art/runtime/gc/collector/mark_compact.cc中。 与Semi-Space GC、Generational Semi-Space GC一样,Mark-Compact GC的执行过程也分为初始化、标记、回收和结束四个阶段,对应的函数分别为MarkCompact类的成员函数InitializePhase、MarkingPhase、ReclaimPhase和FinishPhase。其中,标记和回收阶段是在挂起其它的ART运行时线程的前提下进行的。注意,挂起其它的ART运行时线程的操作通过ScopedPause类的构造函数实现的。当标记和回收阶段结束,ScopedPause类的析构函数就会自动恢复之前被挂起的ART运行时线程。 接下来,我们就分别分析Mark-Compact GC的四个阶段的执行过程,即MarkCompact类的成员函数InitializePhase、MarkingPhase、ReclaimPhase和FinishPhase的实现。 Mark-Compact GC的初始化阶段由MarkCompact类的成员函数InitializePhase实现,如下所示: [cpp] view plain copy void MarkCompact::InitializePhase() { TimingLogger::ScopedTiming t(__FUNCTION__, GetTimings()); mark_stack_ = heap_-GetMarkStack(); immune_region_.Reset(); // TODO: I dont think we should need heap bitm
显示全部
相似文档