g1筛选回收阶段必须stw,因其对象移动需原子完成搬移与引用更新,避免并发导致的数据不一致;rset无法拦截实时访问,且g1缺乏zgc/shenandoah级的并发转移机制,故依赖可控短暂停顿保障状态一致性。

G1 的筛选回收(Evacuation)阶段必须 STW,核心原因在于对象移动过程需要保证引用关系的绝对一致性,而并发移动会破坏这一前提。
对象复制与引用更新必须原子完成
在筛选回收阶段,G1 会把选定 Region 中的存活对象复制到新的空闲 Region,并更新所有指向这些对象的引用。这个过程包含两个不可分割的动作:对象搬移 + 所有旧引用重定向到新地址。如果允许用户线程并发执行,就可能出现以下竞态:
- 用户线程正在读取或修改某个对象 A 的字段,而该对象 A 正被 GC 线程从旧地址复制到新地址;
- 引用尚未全部更新完成时,用户线程通过旧引用访问了已失效的内存位置;
- 更严重的是,若用户线程在复制中途修改了对象 A 的某个字段,而该修改只作用于旧副本,新副本未同步,就会导致数据不一致。
RSet 无法覆盖全部跨 Region 引用场景
G1 用 Remembered Set(RSet)记录跨 Region 的写操作,用于快速定位 GC Roots。但它只记录“谁可能引用我”,不能实时反映“我当前正被谁访问”。在并发移动中,RSet 不足以拦截或转发正在进行中的读/写请求——它不是锁机制,也不提供内存屏障级别的保护。
转移阶段缺乏安全的并发协议支持
不同于 ZGC 或 Shenandoah 使用着色指针(colored pointers)和加载屏障(load barrier)在运行时动态重定向引用,G1 没有这类硬件或 JVM 层级的并发转移基础设施。它的引用更新依赖一次性的、可控的全局暂停,确保所有线程看到的堆状态是迁移前后两个明确快照之一,而非中间混乱态。
STW 是代价可控的确定性选择
G1 的设计目标是在延迟可控的前提下兼顾吞吐量。筛选回收虽然 STW,但只处理已标记为高收益的少量 Region,且复制范围受限。相比 CMS 因浮动垃圾和并发失败导致的不可预测长停顿,G1 将不确定性转移到可预测的短暂停顿中,整体更稳定可靠。











