Go语言的GC详解

前言

Garbage Collection (GC)是⼀种⾃动管理内存的⽅式。⽀持GC的语⾔⽆需⼿动管理内存,程序后
台⾃动判断对象。是否存活并回收其内存空间,使开发⼈员从内存管理上解脱出来。
垃圾回收机制

  • 引⽤计数
  • 标记清除
  • 三⾊标记
  • 分代收集

发展

版本 ——发布时间——GC ——————————STW时间
v 1.1 ——2013/5 ——STW ——————————百ms-⼏百ms级别
v 1.3 ——2014/6 ——Mark STW, Sweep 并⾏ — 百ms级别
v 1.5 ——2015/8—— 三⾊标记法, 并发标记清除 -10ms级别
v 1.8 ——2017/2—— hybrid write barrier ————sub ms

三色标记

  • 有⿊⽩灰三个集合,初始时所有对象都是⽩⾊
  • 从Root对象开始标记, 将所有可达对象标记为灰⾊
  • 从灰⾊对象集合取出对象, 将其引⽤的对象标记为灰⾊, 放⼊灰⾊集合, 并将⾃⼰标记为⿊⾊
  • 重复第三步, 直到灰⾊集合为空, 即所有可达对象都被标记
  • 标记结束后, 不可达的⽩⾊对象即为垃圾. 对内存进⾏迭代清扫,回收⽩⾊对象
  • 重置GC状态

混合写屏障

  • 并发标记时, 如果没有做正确性保障措施,可能会导致漏标记对象,导致实际上可达的对象被清扫
    掉。
    Go语言的GC详解_第1张图片

GC 触发条件

  • gcTriggerHeap

      分配内存时, 当前已分配内存与上⼀次GC结束时存活对象的内存达到某个⽐例时就触发GC。
    
  • gcTriggerTime

      sysmon检测2min内是否运⾏过GC, 没运⾏过 则执⾏GC。
    
  • gcTriggerAlways

      runtime.GC()强制触发GC。
    

你可能感兴趣的:(Go)