栈内存是函数专用内存,存函数入参出参的,(出栈后内存被释放)

堆内存是程序的共享内存 (需要gc释放和管理)

主流回收算法

  1. 引用计数, 销毁速度快
  2. 分代收集,不同代用不同算法,算法复杂 3. 标记整理 4. 标记清除等 5. 复制算法
  3. 标记清除算法 –Golang
    1. 三色标记法

标记清除解决了 引用计数无法识别的缺点,但是需要 STW ,暂停程序运行。

alt text

go标记清除算法使用了混合写屏障和三色标记

Gc过程可以和协程一起执行。

write barrier 是为了防止gc扫描导致内存变化引起混乱,写屏障在gc特定时间开启,开启后指针传递的时候会给指针标记 本轮不回收,下次Gc时候确定。