关于GC的你应该知道的知识
发布时间:2023-03-23 13:43:44 所属栏目:教程 来源:
导读:ArromAndroid中的GCDalvik时期早期全栈回收(没有分区和分代),没有并发(会STW),平均一次GC STW时间大概在100ms作用在Android 2.3之后,有了并行回收(CMS),有了分区回收,平均一次GC STW时间在5ms左右Zygote进
ArromAndroid中的GCDalvik时期早期全栈回收(没有分区和分代),没有并发(会STW),平均一次GC STW时间大概在100ms作用在Android 2.3之后,有了并行回收(CMS),有了分区回收,平均一次GC STW时间在5ms左右Zygote进程Zygote进程在系统启动时完成初始化,包括虚拟机的初始化,核心库的加载等,通过自身复制(fork),可以快速的提供一套app进程和虚拟机实例。Dalvik的堆Live Heap Bitmap和Mark Hea. Zygote进程在系统启动时完成初始化,包括虚拟机的初始化,核心库的加载等,通过自身复制(fork),可以快速的提供一套app进程和虚拟机实例。 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的值都会被置为CLEAN,并发标记之后如果一个card的值时Dirty,就表示在并发标记阶段,这个card对应的128个字节的实例被修改过。 全程只有重新标记一次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去追溯。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐