go_gc

  1. golang gc回收机制

golang gc回收机制

程序在内存上被分为堆,栈,全局数据,代码段,数据区五部分
在go中栈上内存由编译器管理回收,堆上的内存由编辑器和垃圾收集器负责管理回收

golang1.3使用标记清除法
使用stw暂停程序业务,然后查询可达内存和不可达内存,标记内存,清楚不可达内存,停止stw(后改为标记完就停止stw服务)

golang1.5使用三色标记法,将程序对象分为白色,黑色和灰色三类,白色表示暂无对象引用的潜在垃圾,其内存可能被回收;灰色表示活跃对象,白色到黑色的中间态,会扫描他所引用的外部对象;黑色表示活跃对象,包括不存在引用外部指针的对象以及从根对象可达的对象
三色标记法分五步进行
1.将所有对象标记为白色
2.从根节点集合出发,将第一次遍历到的节点标记为灰色放入集合列表中
3.遍历灰色集合,将灰色节点遍历到的白色节点标记为灰色,并把灰色节点标记为黑色
4.循环这个过程
5.直到灰色节点集合为空,回收所有的白色节点

问题:可能中途存在白色对象被黑色对象引用,或者灰色对象和白色对象之间的可达关系遭到破坏,直接进行gc导致回收了不能回收的对象

因此可采用强三色不变式和弱三色不变式
强三色:不允许黑色引用白色
弱三色:允许黑色引用白色,但白色对象存在灰色对象对他的引用或者链路存在灰色对象

插入屏障用来实现强三色:当白色对象被黑色对象引用,白色变为灰色
删除屏障用来实现弱三色:如果灰色对象引用的白色对象被删除,白色对象先标记为灰色

golang1.8三色标记+混合写屏障
混合写屏障分下面四步
1.GC开始时将栈上可达对象全部标记为黑色(不需要二次扫描,无需STW)
2.GC期间,任何栈上创建的新对象均为黑色
3.被删除引用的对象标记为灰色
4.被添加引用的对象标记为灰色


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。