Post

Go GC

Go GC

Go GC

  • stack上的空间会随着pop而自动回收(未发生内存逃逸的元素)
  • heap上的空间由GC自动回收

标记清扫法

  • 三色标记法 + 写屏障技术
  • struct

三色标记法

  • 黑色
    • 查询结束, 有用
  • 灰色
    • 有用但查询尚未结束
  • 白色
    • 无用, 可以删除
  • BFS遍历树
    • 从root节点开始, 遍历所有节点, 打上颜色标记, 当颜色不再变化时, 白色的节点就是可以被释放的节点
    • root节点 -> stack空间 + data segment空间(const常量)

写屏障技术

  • 插入写屏障
  • 删除写屏障
  • 最终目的就是使黑色节点下不会有白色节点
  • 写屏障时依然会出现短暂的STW(stop the world), 也就是应用进程会停顿

内存碎片

  • go语言将根据页大小, 将内存页分成大中小, 选择大小合适的进行分配
  • 碎片过多会进行内存整理(耗时, 涉及到内存移动)

内存逃逸

  • 原本分配在stack上的变量在stack结束后依然会被其他地方使用, 因此将原本应该分配在stack上的空间, 分配到heap上
  • 可能出现内存逃逸的情况
    • 闭包
    • 函数返回指针对象
This post is licensed under CC BY 4.0 by the author.