golang的GC

golang采用三色标记法进行垃圾清理

GC过程分为标记过程和清理过程

产生错误的情况:

  • 黑色对象引用白色对象
  • 灰色对象到白色对象的引用被破坏

破坏这两个条件之一就可以避免错误情况的出现

可能的解决方法: 整个过程STW,浪费资源,且对用户程序影响较大,由此引入了屏障机制

插入屏障解决的是第一种情况(黑色对象饮用白色对象),当黑色对象饮用白色对象时,将白色对象先变成灰色

删除屏障解决的是第二种情况,删除前,对指针所指对象进行着色

混合屏障:

大大缩短了 STW 时间

  • GC 开始将栈上的对象全部扫描并标记为黑色;
  • GC 期间,任何在栈上创建的新对象,均为黑色;
  • 被删除的堆对象标记为灰色;
  • 被添加的堆对象标记为灰色;

GC触发的机制:

  • 主动触发
  • 被动触发(百分比,定时)

百分比:将GC百分比设置为100意味着:基于在垃圾收集完成后标记为活动的堆内存量,下次垃圾收集前,堆内存使用可以增加100%

posted @ 2022-11-20 21:18  XiaojunW  阅读(76)  评论(0编辑  收藏  举报