Go 自 1.8 起采用并发三色标记 GC:对象初始为白色,根可达标记为灰,扫描其引用后转黑;最终仍为白色的对象会被回收。为避免并发标记与程序“黑化后仍指向白对象”的丢失问题,引入 写屏障(write barrier) 与 辅助 GC(mutator assist)。写屏障在指针赋值时把新引用的目标染灰,确保不会丢标;辅助 GC 则在内存分配过快时,让用户协程帮忙做一部分标记工作,以维持 GC 进度与暂停时间(STW)可控。
调优要点:
1)减少短命大对象分配;2)尽量复用内存(如 bytes.Buffer/对象池);3)通过 GODEBUG=gctrace=1 观察停顿与回收比。
示例:避免临时切片抖动
package main
import (
"bytes"
"fmt")
func main() {
var buf bytes.Buffer // 复用内部数组,减少逃逸
for i := 0; i < 3; i++ {
buf.Reset()
for j := 0; j < 1000; j++ {
buf.WriteString("x")
}
fmt.Println(buf.Len())
}}
上例用 bytes.Buffer 聚合写入,避免频繁创建短命切片与字符串,降低 GC 压力与停顿。