我是靠谱客的博主 细腻季节,最近开发中收集的这篇文章主要介绍关于GC的你应该了解的知识,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

作者:Arrom

Android中的GC

Dalvik时期
  • 早期全栈回收(没有分区和分代),没有并发(会STW),平均一次GC STW时间大概在100ms作用
  • 在Android 2.3之后,有了并行回收(CMS),有了分区回收,平均一次GC STW时间在5ms左右

Zygote进程

Zygote进程在系统启动时完成初始化,包括虚拟机的初始化,核心库的加载等,通过自身复制(fork),可以快速的提供一套app进程和虚拟机实例。

Dalvik的堆

Live Heap Bitmap和Mark Heap Bitmap

  • Live Heap Bitmap :上一次GC后,幸存下来的实例
  • Mark Heap Bitmap :本次GC,标记为存活的实例
Mark栈

地址大小关系 A< B <C < D < E

Dalvik的遍历总是从小地址往大地址去操作

从B的根级节点开始遍历,B比D小,所以在bitmap中将B标记为1,同时A比B小,将A放入Mark栈

D节点没有比自己更小的,所以在bitmap中将D标记为1,C是D的子节点,比D小将C放入mark栈,E比D大直接将其标记为1

在将mark栈中C出站,将其标记为1,在A出站,将其标记为1

清除阶段

只需要清除mark里面对应0对应的live中是1的差集就可以了,然后清空Live,再对换二者的指针

标记清除

Card Table

初始标记后,所有card的值都会被置为CLEAN,并发标记之后如果一个card的值时Dirty,就表示在并发标记阶段,这个card对应的128个字节的实例被修改过。

ART的堆

  • Image Space 根据boot.art这个内存镜像文件创建的区域,映射到系统类库,在进程间共享,不会释放内存
  • Zygote Space 和Dalvik时期的Zygote堆作用基本一致
  • Allocation Space等价于Dalvik时期的Active堆,进程私有,用于分配新实例
  • Large Object Spcace:不连续的离散地址集合,用于分配大实例和大数组

ART GC的策略

  • Sticky GC:只回收上一次GC,到本次GC之间创建的垃圾
  • Partial GC:只回收Allocation Space和Large Object Space
  • Full GC:回收Allocation Space ,Large Object Space ,Zygote Space

存在的意思:缩小回收范围,类似于分代回收

粘性标记清除

  • 少一次初始标记
  • 全程只有重新标记一次STW

Allocation栈:指向上次GC以来,创建的实例

Live栈:GC后,Allocation栈中幸存下来的实例,每次GC后,清空,并和Allocation栈交换

有了这两个栈,就可以把粘性标记清除的范围缩小到Allocation内的实例

Mod Union Table

Mod Union Table 一次GC过程中,不参与回收的Space,对参与回收的Space的引用。

好处: 解决跨代问题,对于不参与回收的space,在GC的同时某些card发生变化就可以追溯这些card对参与GC的space的引用,不用全区扫描 可以在标记阶段并行的去通过clean card扫描这些引用,并且可以重复扫描减少了STW。只使用card table的话就必须在并发标记结束后在通过card table去追溯。

最后

以上就是细腻季节为你收集整理的关于GC的你应该了解的知识的全部内容,希望文章能够帮你解决关于GC的你应该了解的知识所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部