GC算法
1. 引用计数
每个单元维护一个域,保存其他单元指向它的引用数量,当引用的数量为0时,将其回收。
优点:
- 算法易实现
- 内存管理与用户程序交织在一起,将GC的代价分散到整个程序,不用STW
缺点
- 不能处理循环引用
- 维护引用计数降低运行效率
2. 标记-清扫
是一种自动内存管理,基于追踪的垃圾收集算法。垃圾回收程序对所有的存活单元进行一次全局遍历确定哪些单元可以回收。算法分为两部分:标记和清扫。标记阶段表明所有存活单元,清扫阶段将垃圾回收。
优点:
- 避免了引用计数不能处理循环引用的缺点
缺点:
- STW(挂起程序)
三色标记算法:对标记阶段的改进(标记过程和用户程序并发进行)
- 起初所有对象都是白色
- 从根出发扫描所有可达对象,标记为灰色,放入待处理队列
- 从队列取出灰色对象,将其引用对象标记为灰色放入队列,自身标记为黑色
- 重复3,直到灰色对象队列为空,此时白色对象即为垃圾,进行回收
Golang的GC实现基于此。
参考:
Golang垃圾回收剖析
有疑问加站长微信联系(非本文作者)