GC:垃圾回收算法

2020-04-16  本文已影响0人  Robin92

简述 G1、ZGC

CMS 有两个缺点,一是产生碎片,二是产生浮动垃圾。它的最大问题是在触发 FullGC 时是单线程的,所以太慢了。

G1

G1 又叫 Garbage First,意思是当决定要进行垃圾回收时,它先进行 垃圾最多 的 Region 的回收。

G1 进行的是分而治之来处理的。

image.png

G1 和 CMS 都用的是并发收集,他们的算法也一样都是 三色标记算法
ZGC 和 Shenandoah 用的算法是 颜色指针

并发标记算法G1

概念

三色标记法

黑 -> 灰 -> 白(由黑色向白色延伸)

漏标

只有在下面两个条件同时满足都会发生漏标:

image.png

所以,解决漏标只需要打破其中一个条件即可。所以解决方法有两种,
一种是跟踪 A->D 的增加;
另一种是跟踪 B->D 的消失。
其分别为:

SATB 这种形式,会在 GC 中创建一个栈,这个栈只存灰色对象指向白色对象的 引用,注意是 引用->)。

G1 为什么要用SATB

因为前者会重新扫描 A。而后者只需要在栈中重新扫描就可以找到 D(都是重新标记阶段)。因为 RememberSet 的存在,在 RSet 中没有人用到 D 就可以认为 D 为垃圾。即它不需要再去扫描整个堆,所以效率更快。

RSet 会记录别人的引用指向我这里面的所有引用。
写屏障,它的意思就是由于 RSet 的存在,每次给对象赋引用的时候,做一些额外的操作,这就是写屏障(概念很无聊)。

G1 有 FGC 吗

有 FGC,当内存不够用时,就会进行 FGC。

G1 触发 FGC 了该怎么办

应该尽量避免触发 FGC。


图示三色标记法: https://making.pusher.com/golangs-real-time-gc-in-theory-and-practice/

上一篇 下一篇

猜你喜欢

热点阅读