作家
登录

Android GC原理探究

作者: 来源: 2017-05-19 10:10:51 阅读 我要评论

因为Art下内存分派和Dalvik下根本没有任何差别,我直接贴图带过了。

3.4 并发和非并发GC

Art在GC上不像Dalvik仅有一种收受接收算法,Art在不合的情况下会选择不合的收受接收算法,比如Alloc内存不敷的时刻会采取非并发GC,而在Alloc后发明内存达到必定阀值的时刻又会触发并发GC。同时在前后台的情况下GC策略也不尽雷同,后面我们会一一给大年夜家解释。

非并发GC

步调1. 调用子类实现的成员函数InitializePhase履行GC初始化阶段。

步调2. 挂起所有的ART运行时线程。

那么这个阀值又是若何来的呢,膳绫擎我们说到的一个目标应用率,GC后我们会记录一个目标值,这个值理论上须要再上述典范围之内,如不雅不在我们会拔取界线值骼愍目标值。虚拟机会记录这个目标值,当做当前许可总的可以分派到的内存。同时根据目标值减去固定值(200~500K),当做触发GC_CONCURRENT事宜的阈值。

步调3. 调用子类实现的成员函数MarkingPhase履行GC标记阶段。

步调4. 调用子类实现的成员函数ReclaimPhase履行GC收受接收阶段。

步调5. 恢复第2步挂起的ART运行时线程。

步调4. 释放用于拜访Java堆的锁。

步调6. 调用子类实现的成员函数FinishPhase履行GC停止阶段。

并发GC

步调1. 调用子类实现的成员函数InitializePhase履行GC初始化阶段。

步调2. 获取用于拜访Java堆的锁。


1、JVM内存收受接收机制

步调3. 调用子类实现的成员函数MarkingPhase履行GC并行标记阶段。

Android GC道理商量

步调5. 挂起所有的ART运行时线程。

步调6. 调用子类实现的成员函数HandleDirtyObjectsPhase处理在GC并行标记阶段被修改的对象。。

步调7. 恢复第4步挂起的ART运行时线程。

记得我们之前在优化魅族某手机的gc卡顿问题时,发明他很轻易触发GC_FOR_MALLOC,这个GC类别后续会说到,是分派对象内存不足时导致的。可是我们又设置了很大年夜的堆Size为什么还会内存不敷呢,这里须要懂得以下几个概念:分别是Java堆的肇端大年夜小(Starting Size)、最大年夜值(Maximum Size)和增长上限值(Growth Limit)。

步调8. 反复第5到第7步,直到所有在GC并行阶段被修改的对象都处理完成。

步调9. 获取用于拜访Java堆的锁。

步调10. 调用子类实现的成员函数ReclaimPhase履行GC收受接收阶段。

步调11. 释放用于拜访Java堆的锁。

步调12. 调用子类实现的成员函数FinishPhase履行GC停止阶段。

所以不论是并发照样非并发,都邑引起stopworld的情况出现,并发的情况下单次stopworld的时光会更短,根本差别和。

3.5 Art并发和Dalvik并发GC的差别

起首可以经由过程如下2张图来比较下

Dalvik GC:

Art GC: 

Art的并发GC和Dalvik的并发GC有什么差别呢,初看似乎2者差不多,固然没有一向挂起线程,然则也会有暂停线程去履行标记对象的流程。经由过程浏览相干文档可以懂得到Art并发GC对于Dalvik来说重要有三个优势点:

    1. 标记自身

 Art在对象分派时会将新分派的对象压入到Heap类的成员变量allocationstack描述的Allocation Stack中去,大年夜而可以必定程度缩减对象遍历范围。

    2. 预攫取

 对于标记Allocation Stack的内存时,会预攫取接下来要遍历的对象,同时再掏出来该对象后又会将该对象引用的其他对象压入栈中,直至遍历完毕。

      3. 削减Pause时光

在Mark阶段是不会Block其他线程的,这个阶段会有脏数据,比如Mark发明不会应用的然则这个时刻又被其他线程应用的数据,在Mark阶段也会处理一些脏数据而不是留在最后Block的时刻再去处理,如许也会削减后面Block阶段对于脏数据的处理的时光。

3.6 前后台GC

前台Foreground指的就是应用法度榜样在前台运行时,而后台Background就是应用法度榜样在后台运行时。是以,Foreground GC就是应用法度榜样在前台运行时履行的GC,而Background就是应用法度榜样在后台运行时履行的GC。

应用法度榜样在前台运行时,响应性是最重要的,是以也请求履行的GC是高效的。相反,应用法度榜样在后台运行时,响应性不是最重要的,这时刻就合实用来解决堆的内存碎片问题。是以,Mark-Sweep GC合适作为Foreground GC,而Mark-Compact GC合适作为Background GC。

因为有Compact的才能存在,碎片化在Art上可以很好的被避免,这个也是Art一个很好的才能。

3.7 Art大年夜法好

总的来看,art在gc上做的比dalvik好太多了,不然则gc的效力,削减pause时光,并且还在内存分派上对大年夜内存的有零丁的分派区域,同时还能有算法在后台做内存整顿,削减内存碎片。对于开辟者来说art下我们根本可以避免很多类似gc导致的卡顿问题了。别的根据谷歌本身的数据来看,Art相对Dalvik内存分派的效力进步了10倍,GC的效力进步了2-3倍。


  推荐阅读

  “互联网+”下船舶业十大发展趋势

“互联网+”已深刻社会各范畴,有“综合工业之冠”的船舶业袈溱物联网、大年夜数据、云计算等技巧的影响下,传统基本举措措施和立异要素日益变更,行业生态体系和成长>>>详细阅读


本文标题:Android GC原理探究

地址:http://www.17bianji.com/lsqh/35313.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)