因为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并行标记阶段。
步调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
1/2 1