1. 三色标记-清除算法
Go 的垃圾回收器基于三色标记-清除(Mark-and-Sweep)算法进行工作,这个算法可以将所有内存对象分为三类(即三色):
白色:对象还未被标记为可达的,这些对象可能会被清除。
灰色:对象已经被发现并标记为可达,但它的子对象还未被检查。
黑色:对象已经被标记为可达,且它的子对象也都已经被处理。
2. 工作流程
GC 的工作流程通常分为两个阶段:
标记阶段(Mark Phase):从一组根对象(通常是栈、全局变量等)开始,遍历所有可以访问的对象,并将这些对象标记为 "黑色" 或 "灰色",即它们是可达的,不应该被回收。这个阶段的主要工作是从灰色对象开始遍历其子对象,直到所有可达对象都被标记。
清除阶段(Sweep Phase):遍历堆中的所有对象,将未被标记(即白色)的对象回收。被回收的对象将被认为是不可达的,回收其内存空间。
3. 并发垃圾回收
Go 的垃圾回收是 并发 和 分代 的,意味着垃圾回收器能够在程序继续运行的同时执行。具体而言,Go 的 GC 会在后台运行一部分标记工作,而不是在标记时暂停所有 Goroutine 的运行,从而减少停顿时间。
展开
评论