标记,扫地,整理
最后更新于:2022-04-02 04:09:18
[TOC]
## 什么场景下gc很重要
- 内存需要被反复利用的场景
- 大量的对象在被分配和回收
- 高并发场景
## 标记(Mark-Sweep)算法

- 栈中分配的对象存入一个集合中( Root set)
- 每次遍历 Rootlet中的对象追溯Heap中的对象进行分析
- 分成两个阶段标记(Mark)和清扫( Sweep)阶段
- Mak负责标记在使用的对象
- Sweep负责删除不被使用的对象
**Mark 阶段**

**Sweep阶段**

删除没有被标记的对象
## gc时程序状态
### STP(Stop The World) 模型

执行时每一个阶段,都要全部执行完全
### Increment Update 模型

每个阶段多次执行
## Stop-the-world 问题
很难做到不STW,但是可以考虑缩短STW的时间,让用户感知到的是一个连续的模型
## 三色标记
go 使用 三色
白色:需要回收
黑色:不回收
灰色:中间地带
Root->白->灰
扫描 root set,找到白色节点标记成灰色

灰->黑
以灰色节点为起始点,做一次BFS。之前的灰色节点标黑,剩下的白色节点就是需要回收的


**会不会有 mutation违反性质**
- 方法
- 读取白色节点时增加一个读屏障( read barrier),禁止读取
- 改变一个黑色节点时增加一个写屏障 write barrier),写入结束后,将这个节点标记成为灰色。
- 严格保证了不会有黑色节点指向白色节点。
';