垃圾回收(Garbage Collection),是一种自动管理内存的机制。传统编程语言(如C/C++)需要开发者对无用内存资源进行手动释放。而 Go 则是通过 runtime 实现对内存资源的管理,自动释放无用内存资源。
三色标记法将对象分为三类:
白色对象(可能死亡)
:未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。灰色对象(确定存活)
:已被回收器访问到的对象,此时已经能确认该对象是存活的。但回收器需要对其中的一个或多个指针进行扫描,因为他们可能还指向其他白色对象。黑色对象(确定其所有引用此对象的对象)
:已被回收器访问到的对象,其中所有字段都已被扫描,黑色对象中任何一个指针都不可能直接指向白色对象。GC工作流程(其中有两次stop the world
!):
对于黑色 object,如果在标记期间发生了写操作,写屏障会在真正赋值前将新对象标记为 灰色。
标记过程中,mallocgc 新分配的 object,会先被标记成 黑色 再返回。
root对象在垃圾回收的术语中又叫做root集合,它是垃圾回收器在标记过程时最先检查的对象。
根对象包括:
全局变量
:程序在编译期就能确定的那些存在于程序整个生命周期的变量。执行栈
:每个 goroutine 都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配的堆内存区块的指针。寄存器
:寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存区块。1、内存分配量达到阀值触发
2、定期触发
3、手动触发