Go GC
Go GC
Go GC
- stack上的空间会随着pop而自动回收(未发生内存逃逸的元素)
- heap上的空间由GC自动回收
标记清扫法
三色标记法
- 黑色
- 查询结束, 有用
- 灰色
- 有用但查询尚未结束
- 白色
- 无用, 可以删除
- 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.
