← 中文资源

简体中文版本

GC 停顿与 Stop-the-World

GC 停顿是运行时停止应用线程以枚举并移动对象的间隙;其长度与频率由收集器选择和分配速率决定,构成延迟地板。

阅读英文原文

概念定义

追踪式回收必须看到一致的对象图,线程要在安全点停下供根扫描,压实式收集器还要挪对象。决定交互服务延迟地板的是停顿分布,不是平均值。

工作机制

年轻代收集在空间间拷贝幸存者,停顿与存活对象量成正比。并发老年代收集器边跑边标记,只在再标记与搬迁时短暂停顿:ZGC 与 Shenandoah 在大堆上瞄准亚毫秒停顿,代价是 CPU 开销。Go 把每周期 STW 压进两个极窄窗口,并按分配速率节流协助任务。

使用场景

先测量再调参:停顿日志与分配画像在前、收集器旗标在后。换异种收集器之前先降分配速率——池化热对象、原始类型集合、缓冲复用。按 SLA 选收集器:吞吐批处理与 p99 敏感 API 各有所归。

常见误区

“并发收集器无停顿”是缩小而非消除:根扫描与搬迁仍停线程。停顿不只看堆大小——存活集、引用密度、分配速率同样主导。巨型对象会跳过年轻代并破坏老年代节奏;分配突发超过标记速度时,并发收集器会让分配节流反过来压制应用。无安全点轮询的长计数循环能把微停顿拉成数百毫秒。