为什么需要垃圾回收?
自动释放不需要的对象,让出存储器资源,无需程序员手动执行
Go V1.3之前是标记-清除算法
具体步骤
缺点:程序卡顿、扫描整个heap、数据清除会产生heap碎片
V1.3之后,做了简单的优化
V1.5之后,使用三色并发标记法
只要是新创建的对象,默认颜色都是白色
触发条件:当一个白色对象被黑色对象引用(白色对象挂在黑色对象下面) 且 灰色对象与它之间可达关系的白色对象遭到了破坏。
引入了屏障机制
强三色不变性:强制性不允许黑色对象引用白色对象
弱三色不变性:所有被黑色对象引用的白色对象都处于灰色保护状态
为了遵循上述的两种方式,有两种方式,插入屏障,删除屏障
插入屏障:在A对象引用B对象的时候,B对象被标记为灰色(讲B挂在A下游,B必须被标记为灰色),满足强三色不变式。
黑色对象的内存槽有两种位置,栈和堆,栈的特点是空间容量比较小,要求相应的速度快,因为函数调用弹出频繁,所以“插入屏障”机制在栈空间的操作对象中不使用,而仅仅在堆空间对象的操作中。
删除屏障,具体操作:被删除的对象,如果自身为灰色或者白色,那么被标记为灰色。满足:弱三色不变性(保护灰色对象到白色对象的路径不会断)