- 1、本文档共22页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- AQL及抽样解析.ppt
- APQP流程优化解析.ppt
- ArcGISEngine中的地图组成及图层控制中的显示对象解析.ppt
- AQWA培训解析.ppt
- AQ标准《危险与可操作性分析(HAZOP分析)应用导则解读解析.ppt
- AReviewonSiliconeRubber.pdf-副本-副本解析.doc
- ARES-7-Professional教程解析.ppt
- ARIMA模型预测解析.docx
- ARM中断向量表与响应流程解析.docx
- AreYouGoodatLogistics解析.ppt
- 卸载无线终端开发认证组技术战略telus full standalone terminal specification v 31.pdf
- 嵌入式实验三四报告.pdf
- 测试报告编号期共瓷片成功.pdf
- 单元课听力level mp3对应文字.pdf
- 演示结束非常感谢fanuc pf系列冲床用特点号展机轴控制pcfs0i.pptx
- 补丁顺序实用符文之语.pdf
- 章函数解决方案chapter 12 functions solutions12解答.pdf
- 文本课件参考83154f.pdf
- 课件教程案例2212-页mtz0 xxtamil paper 1 sl.pdf
- sigma-sml共6 aldrich安全数据表.pdf
文档评论(0)