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

管理信息化VR虚拟现实ART运行时垃圾收集GC过程分析.pdf

管理信息化VR虚拟现实ART运行时垃圾收集GC过程分析.pdf

  1. 1、本文档共116页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

您可能关注的文档

文档评论(0)

qicaiyan + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档