网站大量收购闲置独家精品文档,联系QQ:2885784924

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

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

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ART运行时Mark-Compact(MC)GC执行过程分析解析

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

文档评论(0)

此项为空 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档