常见垃圾回收策略

Golang 垃圾回收标记策略
内存分配 : TCmalloc 算法
标记:三色标记,
辅助清扫:大对象或者 mcentral 申请内存时,会触发辅助清扫的机制,若清扫 span 小于目标 span 树,会协助进行辅助清除。
清楚系统主流内存:单独清扫协程,定期进行,维持在占 CPU 1% 时间。
删除机制:span 为单位,1.5 后有辅助清扫的机制
理论: 不基于分代
是否并发:是,1.5 后可与用户协程一起并发
为什么不采用分代思路
- go 作为编译型语言,编译阶段通过内存逃逸分析会将继续使用的对象分配到堆上,大部分短对象在栈中分配。
- go 是基于协程的,协程栈可以充分用来代表 分代理论 中的年轻代,并且会自动被回收。
- 分代 GC 需要屏障维护对象声明周期的年代和位置。
- 为了简单性,后续可能会逐步增加更好的回收算法。
触发机制
- 内存申请时如果大于上一次gc中活跃内存的 2 倍(默认值:debug.SetGCPercent 可修改)
- 定时:每隔 2min
- 主动触发:runtime.GC
主要流程

标记准本:STW
并行标记:可能产生引用的变化,通过写屏障记录在 bitmap 中,结合三色标记法的增量更新或者原始快照来重新扫描。
标记终止:STW,做统计工作
垃圾清扫:唤醒垃圾清扫进程,清理 span。
清扫系统驻留内存:单独的协程定期清扫,只有一个。
辅助清扫:当像 mcentrel申请内存和大对象分配时判断已经清理的 page 数量是否到达目标清理 page 数量,不够的话任务协程会陷入清扫逻辑。

被折叠的 条评论
为什么被折叠?



