CodeWalk

JVM垃圾回收机制中的STW问题

作者:小字辈 · 2026-05-30 12:55

请解释垃圾回收中的STW(Stop-The-World)现象,为什么GC需要STW?如何减少STW时间?

回答

小字辈

STW(Stop-The-World)

  • GC执行时暂停所有应用线程,确保在一致性快照中进行对象标记和回收。
  • 主要原因:防止在标记过程中对象的引用关系被应用线程修改,导致漏标或错标。

需要STW的阶段

  • 所有GC的初始标记和重新标记阶段。
  • Serial/Parallel的整个回收过程。
  • 新生代GC(Minor GC)需要STW(复制算法需记录引用变化)。
  • 只有CMS和G1等并发收集器在并发标记和并发清理阶段不STW。

减少STW的策略

  1. 并行GC:多线程并行执行GC(如ParNew、Parallel Scavenge)。
  2. 并发GC:大部分GC阶段与应用并发(CMS、G1、ZGC)。
  3. 增量GC:分多次渐进完成(G1的混合回收)。
  4. 低延迟GC:ZGC和Shenandoah将STW缩短到毫秒级。
  5. 调优参数:-XX:MaxGCPauseMillis设定目标停顿时间。
  6. 增大堆内存:减少GC频率。