作家
登录

Android GC原理探究

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

媒介

想写一篇关于android GC的设法主意来源竽暌冠追查一个魅族手机图片滑动卡顿问题,因为赓续的GC导致的丢帧卡顿的问题让我们想了很多筹划去解决,所以就计算具体的看看内存分派和GC的道理,为什么会赓续的GC,GC ALLOC和GC COCURRENT有什么差别,能不克不及想办法扩大年夜堆内存削减GC的频次等等。

1.1 收受接收算法

标记收受接收算法(Mark and Sweep GC)

其实2者最大年夜的差别在于前者是用空间换时光后者则是用时光换空间。

大年夜”GC Roots”集合开端,将内存全部遍历一次,保存所有可以被GC Roots直接或借居引用到的对象,而剩下的对象都算作垃圾对待并收受接收,这个算法须要中拒却程内其它组件的履行并且可能产生内存碎片

复制算法 (Copying)

将现有的内存空间分为两快,每次只应用个一一块,在垃圾收受接收时将正在应用的内存中的存活对象复制到未被应用的内存块中,之后,清除正在应用的内存块中的所有对象,交换两个内存的角色,完成垃圾收受接收。

标记-紧缩算法 (Mark-Compact)

先须要大年夜根节点开端对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象紧缩到内存的一端。之后,清理界线外所有的空间。这种办法既避免了碎片的产生,又不须要两块雷同的内存空间,是以,其性价比比较高。

分代

将所有的新建对象都放入称为年青代的内存区域,年青代的特点是对象会很快收受接收,是以,在年青代就选择效力较高的复制算法。当一个对象经由几回收受接收后依然存活,对象就会被放入称为老生代的内存空间。对于新生代实用于复制算法,而对于老年代则采取标记-紧缩算法。

1.2 复制和标记-紧缩算法的差别

乍一看这两个算法似乎并没有多大年夜的差别,都是标记了然后挪到别的的内存地址进行收受接收,那为什么不合的分代要应用不合的收受接收算法呢?

前者的在工作的时刻是不没有自力的“mark”与“copy”阶段的,而是合在一路做一个动作,就叫scavenge(或evacuate,或者就叫copy)。也就是说,每发明一个此次收集中尚未拜访过的活对象就直接copy到新处所,同时设置forwarding pointer。如许的工作方法就须要多一份空间。

后者在工作的时刻则须要分其余mark与compact阶段,mark阶段用来发明并标记所有活的对象,然后compact阶段才移动对象来达到compact的目标。如不雅compact方法是sliding compaction,则在mark之后就可以按次序一个个对象“滑动”到空间的某一侧。因为已经先遍历了全部空间里的对象图,知道所有的活对象了,所以移动的时刻就可以在同一个空间内而不须要多一份空间。

所以新生代的收受接收会更快一点,老年代的收受接收则会须要更长时光,同时紧缩阶段是会暂停应用的,所以给我们应当尽量避免对象涌如今老年代。

2、Dalvik虚拟机

2.1 java堆

Java堆实际上是由一个Active堆和一个Zygote堆构成的,个中,Zygote堆用来治理Zygote过程在启动过程中预加载和创建的各类对象,而Active堆是在Zygote过程fork第一个子过程之前创建的。今后启动的所有应用法度榜样过程是被Zygote过程fork出来的,并都持有一个本身的Dalvik虚拟机。在创建应用法度榜样的过程中,Dalvik虚拟机采取COW策略复制Zygote过程的地址空间。

COW策略:一开端的时刻(未复制Zygote过程的地址空间的时刻),应用法度榜样过程和Zygote过程共享了同一个用来分派对象的堆。当Zygote过程或者应用法度榜样过程对该堆进行写操作时,内核就会履行真正的拷贝操作,使得Zygote过程和应用法度榜样过程分别拥有本身的一份拷贝,这就是所谓的COW。因为copy是十分耗时的,所以必须尽量避免copy或者尽量少的copy。

为了实现这个目标,当创建第一个应用法度榜样过程时,会将已经应用了的那部分堆内存划分为一部分,还没有应用的堆内存划分为别的一部分。前者就称为Zygote堆,后者就称为Active堆。如许只需把zygote堆中的内容复制给应用法度榜样过程就可以了。今后无论是Zygote过程,照样应用法度榜样过程,当它们须要分派对象的时刻,都在Active堆长进行。如许就可以使得Zygote堆尽可能少地被履行写操作,因而就可以削减履行写时拷贝的操作。在Zygote堆琅绫擎分派的对象其实重要就是Zygote过程在启动过程中预加载的类、资本和对象了。这意味着这些预加载的类、资本和对象可以在Zygote过程和应用法度榜样过程中做到经久共享。如许既能削减拷贝操作,还能削减对内存的需求。

2.2 和GC有关的一些指标

在启动Dalvik虚拟机的时刻,我们可以分别经由过程-Xms、-Xmx和-XX:HeapGrowthLimit三个选项来指定上述三个值,以上三个值分别表示表示

  • Starting Size: Dalvik虚拟机启动的时刻,会先分派一块初始的堆内存给虚拟机应用。
  • Growth Limit:是体系给每一个法度榜样的最大年夜堆上限,跨越这个上限,法度榜样就会OOM
  • Maximum Size:不受控情况下的最大年夜堆内存大年夜小,肇端就是我们在用largeheap属性的时刻,可以大年夜体系获取的最大年夜堆大年夜小

同时除了膳绫擎的┞封个三个指标外,还有几个指标也是值得我们存眷的,那就是堆最小余暇值(Min Free)、堆最大年夜余暇值(Max Free)和堆目标应用率(Target Utilization)。假设在某一次GC之后,存活对象占用内存的大年夜小为LiveSize,那么这时刻堆的幻想大年夜小应当为(LiveSize / U)。然则(LiveSize / U)必须大年夜于等于(LiveSize + MinFree)并且小于等于(LiveSize + MaxFree),每次GC后垃圾收受接收器都邑尽量让堆的应用率往目标应用率挨近。所以当我们测验测验手动去生成一些几百K的对象,试图去扩大年夜可用堆大年夜小的时刻,反而会导致频繁的GC,因为这些对象的分派会导致GC,而GC后会让堆内存回到合适的比例,而我们应用的局部变量很快会被收受接收理论上存活对象照样那么多,我们的堆大年夜小也会缩减回来无法达到扩充的目标。 与此同时这也是产生CONCURRENT GC的一个身分,后文我们会具体讲到。

 1/4    1 2 3 4 下一页 尾页

  推荐阅读

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

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


本文标题:Android GC原理探究

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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