其他分享
首页 > 其他分享> > GC垃圾回收

GC垃圾回收

作者:互联网

GC垃圾回收

地址:https://www.bilibili.com/video/BV1wz4y1y7Kd?spm_id_from=333.999.0.0

1. Go V1.3 之前标记清除法(mark and sweep)

程序可达对象有1->2->34->7等五个对象;

​ 在进行垃圾回收时,为了避免程序错乱,首先会进行STW(stop the world),将程序业务逻辑进行暂停,然后将程序可达对象全部进行标记,未被标记的对象被视为垃圾需要进行回收。垃圾回收完成后,解除STW,程序继续执行;

标记清除法的缺点:

优化:

​ 尽量缩短STW时间,将垃圾清除和停止STW进行互换,缩短STW时间,即先解除STW,然后执行垃圾回收(上面三、四步之间进行交换)。但是标记时间任然过长;

2. Go V1.5 三色标记法

程序可达对象有1->2->34->7等五个对象;

三色:白、灰、黑,分别对应三色标记表,其中灰色为临时状态,最终态为白色或者黑色;

​ 初始将程序所有对象标记为白色,遍历一次程序根集合,将一次比那里可达对象标记为灰色,然后将可达对象由白色标记为灰色,并将对象移至灰色标记表;然后遍历灰色标记表,将可达对象由白色变为灰色,遍历之后的灰色变为黑色。重复之前操作,直到灰色标记表没有数据。最后剩余的白色对象即为垃圾。

如果三色标记过程中不启用STW:

如果上述两个条件同时满足,就会造成对象丢失(会导致对象3丢失),所以还是要加STW

解决办法:阻止上述两个条件同时成立

只要满足强/弱三色不变式之一,即可保证对象不丢失;

根据强/弱三色不变式,衍生了屏障机制:

3. Go V1.8 三色标记法+混合写屏障机制

栈上不使用:

标签:灰色,标记,对象,白色,回收,栈上,STW,GC,垃圾
来源: https://www.cnblogs.com/wustjq/p/16439693.html