GC 停顿(GC Pause / Stop-the-World,简称 STW)指的是:
垃圾回收器在执行某些阶段时,会把整个应用程序的所有业务线程
全部暂停,直到回收完成后再继续运行;
这段“冻结”时间就称为 GC 停顿。
1. 为什么会停顿?
垃圾回收器需要移动或清理对象时,必须保证:
-
内存里的指针都是一致的;
-
没有线程在并发修改对象图。
因此它不得不让所有业务线程“停一停”,进入安全点(Safe Point),回收完再“解冻”。
2. 停顿多久算问题?
场景 | 可容忍停顿 |
---|---|
Web 后端 | 100 ms 以内用户无感 |
普通撮合引擎 | 10 ms 以内 |
高频 / 微秒级策略 | 100 µs 以内才安全 |
Go 的 GC 停顿通常 0.5–2 ms,Java G1 默认 几十到几百毫秒,在高频里会直接拖慢策略或错过行情。
3. 表现形式
-
日志突然跳一跳:“GC took 1.2 ms”
-
监控曲线:P99 延迟尖峰
-
用户体感:浏览器/APP 卡顿
-
交易系统:撮合延迟爆表、丢单
4. 如何减少或避免 GC 停顿?
做法 | 适用语言 | 备注 |
---|---|---|
无 GC 语言 | Rust / C++ | 根本不存在 STW |
降低对象分配 | Go / Java | 复用对象、对象池 |
并发回收器 | Java ZGC、Go 1.20+ | 停顿降到 <1 ms,但仍有 |
分代+Region | Java G1、Go GC | 减少单次扫描范围 |
一句话总结
GC 停顿就是 “为了打扫房间,先让所有人原地立正”;
在高频交易里,任何毫秒级停顿都可能错过行情,因此 Rust/C++ 这类无 GC语言成为首选。