GC垃圾回收
垃圾回收机制是一种自动管理内存的方式,是内存资源的回收,是程序后台自动判断对象是否要回收,使得开发人员从内存管理上解脱出来。
垃圾回收下列几种:
- 引用计数
- 标记清除
- 三色标记
- 分代收集
C VS Go 申请内存和释放内存,看出Go GC自动管理内存,确实方便。
//开辟内存空间
int *p = (int*)malloc(sizeof(int));
//释放空间
free(p);
//开辟空间,不需要手动释放
p := new(int)
当前Go GC特征:
三色标记,并发标记和清扫,非分代,非紧凑,混合写屏障。这里重点了解三色标记法和写屏障。
三色标记法:
- 将所有对象放在白色集合中
- 从rootset开始遍历可达对象,将可达对象发在灰色集合中,
- 将灰色集合中对象进行遍历,将可达对象放在灰色集合中,将其本身放在黑色集合中
- 重复第三步骤 直到灰色集合遍历为空
- 将白色集合中的对象视为垃圾进行清扫
- 重置黑色集合对象,将其变为白色,进行下次GC
参考链接:https://studygolang.com/articles/25916
写屏障
在三色标记法中,黑色集合中的对象不能引用无法被灰色对象可达的白色对象。并发标记时,这是go垃圾回收的一个特点,在程序没有执行完,已经在后台进行垃圾回收,这当中如果没有做正确性保障措施,可能会导致漏标,导致实际上可达的对象被清扫掉。于是引入了写屏障, 是在写入指针前执行的一小段代码,以防止并发标记时指针丢失。
参考链接:https://cloud.tencent.com/developer/article/1526095