- 1、本文档共116页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
管理信息化 VR 虚拟现实 ART 运行
时垃圾收集 GC 过程分析
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()){
return;
}
{
MutexLockmu(self,*Locks::runtime_shutdown_lock_);
if(runtime-IsShuttingDown()){
return;
}
}
if(self-IsHandlingStackOverflow()){
return;
}
//Wealreadyhavearequestpending,noreasontostartmoreuntilweupdate
//concurrent_start_bytes_.
concurrent_start_bytes_=std::numeric_limitssize_t::max();
JNIEnv*env=self-GetJniEnv();
DCHECK(WellKnownClasses::java_lang_Daemons!=NULL);
DCHECK(WellKnownClasses::java_lang_Daemons_requestGC!=NULL);
env-CallStaticVoidMethod(WellKnownClasses::java_lang_Daemons,
WellKnownClasses::java_lang_Daemons_requestGC);
CHECK(!env-ExceptionCheck());
}
这个函数定义在文件 artgc/ 。
只有满足以下四个条件,Heap 类的成员函数RequestConcurrentGC 才会触发一个并行GC :
1.ART 运行时已经启动完毕。
2.ART 运行时支持并行 GC 。ART 运行时默认是支持并行 GC 的,但是可以通过启动选项-Xgc
来关闭。
3.ART 运行时不是正在关闭。
4. 当前线程没有发生栈溢出。
上述 4 个条件都满足之后,Heap 类的成员函数 RequestConcurrentGC 就将成员变量
concurrent_start_bytes_的值设置为类型 size_t 的最大值,表示目前正有一个并行GC 在
等待执行,以阻止触发另外一个并行 GC 。
最后,Heap 类的成员函数RequestConcurrentGC 调用 Java 层的.Daemons 类的静态成员函数
requestGC 请求执行一次并行 GC 。Java 层的.Daemons 类在加载的时候,会启动五个与堆或
者 GC 相关的守护线程,如下所示:
[java]view
您可能关注的文档
- 管理信息化OA自动化建筑工业自动化领域综合方案.pdf
- 管理信息化OA自动化某财务办公自动化系统设计与实现论文.pdf
- 管理信息化OA自动化配网自动化仿真培训系统实训指导书.pdf
- 管理信息化OA自动化瑞晶Regin楼宇自动化BA系统技术方案.pdf
- 管理信息化OA自动化我国电网调度自动化的发展——从SCADA到EMS.pdf
- 管理信息化OA自动化需求规约OA办公自动化系统.pdf
- 管理信息化OA自动化浙商银行SOA柜面业务系统分析.pdf
- 管理信息化SAP实施SAPPP功能详解doc86页.pdf
- 管理信息化SAP实施sapR3系统功能详解.pdf
- 管理信息化SCM供应链管理a供应链管理.pdf
- 甘肃省XB师范大学附属中学2025届高三上学期一模诊断考试地理答案.doc
- 甘肃省XB师范大学附属中学2025届高三上学期一模诊断政治含解析.doc
- 安徽省皖江名校2024-2025学年高一上学期12月联考英语无答案.doc
- 2025年1月八省联考高考综合改革适应性测高三化学陕西山西宁夏青海卷无答案.doc
- 2025年1月八省联考高考综合改革适应性测高三化学四川卷无答案.doc
- 2025年1月八省联考高考综合改革适应性测高三政治陕西山西宁夏青海卷无答案.doc
- 2025年1月内蒙古自治区普通高等学校招生考试适应性测试(八省联考)历史无答案.doc
- 2025年1月内蒙古自治区普通高等学校招生考试适应性测试(八省联考)历史含解析.doc
- 2025年1月四川省普通高等学校招生考试适应性测试(八省联考)历史含解析.doc
- 2025年1月四川省普通高等学校招生考试适应性测试(八省联考)政治无答案.doc
文档评论(0)