直接回答:Go GC 是并发三色标记-清除:大部分标记工作与业务 goroutine 并发进行,只有两次短暂的 STW(标记开始/结束)。触发节奏由 GOGC 控制:新堆达到上次 GC 后存活堆的 (1 + GOGC/100) 倍时触发,默认 100 即"翻倍才扫"。调大 GOGC 减少 GC 频率、省 CPU 但占更多内存;调小则相反。GOMEMLIMIT(1.19+)是内存软上限:逼近上限时 GC 更激进,宁可多烧 CPU 也不 OOM。
展开解析:生产调优的推荐姿势是组合使用:容器环境把 GOMEMLIMIT 设为容器限额的 80%~90%(给非堆内存留余量),这是防 OOM 的保险丝;GOGC 保持默认,只有明确观测到 GC 占用 CPU 过高(pprof 里 mark 占比大)且内存富余时才上调。要警惕 GOGC=off 加无上限的玩法——内存涨穿只是时间问题。比调参更根本的是减少分配:逃逸分析(go build -gcflags=-m)找出意外堆分配,sync.Pool 复用热对象,避免字符串反复拼接。观测工具链:GODEBUG=gctrace=1 看每次 GC 的耗时与堆变化,runtime/metrics 或 prometheus exporter 做持续监控。
追问方向:三色标记为什么需要写屏障?GC 的 pacer 如何决定辅助标记量?什么场景该考虑 ballast 或手动 GC?
(约 450 字)