垃圾回收中的STW是什么?
hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶
2025 面试题大全🔗
一、什么是 STW?
STW(Stop-The-World),中文常译为“万物停顿”或“全局暂停”。它指的是在垃圾回收过程中,为了确保一致性,JVM 会暂停所有应用程序线程的执行。此时,整个 Java 应用程序会表现得像卡住了一样,无法响应任何请求。
可以把它想象成进行大扫除时,需要让所有员工暂时停下手中的工作,离开工位,这样清洁人员才能高效、安全地清理垃圾,而不会漏掉垃圾或误扔重要文件。STW 就是 JVM 为了“安全地清理内存垃圾”而让所有业务线程“暂停工作”的过程。
二、为什么必须要有 STW?
GC 过程必须 STW 的根本原因是:为了避免在垃圾回收过程中,应用程序线程与垃圾收集器同时修改对象引用关系,从而导致数据不一致和回收错误。
如果不暂停应用线程,可能会发生以下问题:
-
误杀仍在使用的对象:
- 场景:垃圾收集器正在标记存活对象。当一个对象已经被标记为“垃圾”后,在回收前的一瞬间,一个应用线程突然又创建了一个对该对象的引用。
- 后果:垃圾收集器不知道这个新变化,会错误地将这个仍在使用的对象回收,导致程序后续运行出错。
-
回收不彻底或产生浮动垃圾:
- 场景:垃圾收集器刚刚完成对一个区域的标记,认为某些对象是垃圾。但在回收执行前,应用线程又“抛弃”了另一个原本被标记为“存活”的对象。
- 后果:这个新产生的垃圾对象无法在此次收集中被清理,变成了“浮动垃圾”。
为了杜绝这些竞态条件,最简单可靠的方法就是在进行关键操作(如枚举根节点、标记存活对象)时,让所有业务线程暂停,就像为垃圾回收按下了一个“静音键”和“暂停键”。
三、STW 发生在哪些阶段?
不同的垃圾收集器在其工作流程的不同阶段会发生 STW。
-
Minor GC / Young GC:
- 几乎所有收集器在 Minor GC 时都会发生 STW。其目的是为了快速标记出 Eden 区和 Survivor 区中的存活对象,并将它们复制到另一个 Survivor 区或老年代。这个过程通常非常短暂。
-
Major GC / Full GC:
- 标记-清除(Mark-Sweep):在标记阶段需要 STW 来根节点枚举和进行可达性分析。
- 标记-整理(Mark-Compact):在标记和整理阶段都需要 STW。整理阶段需要移动存活对象并更新所有引用指针,必须暂停所有线程才能安全地进行。
-
安全点(Safepoint):
- JVM 并不会在代码的任何地方都随意暂停线程,而是在一些特定的位置,即安全点,才发起 STW。这些位置通常是方法调用、循环跳转、异常抛出等,其特点是“可以让程序长时间执行的特征”。
四、STW 的影响与衡量指标
- 影响:STW 的直接表现就是服务暂停、请求超时、响应延迟升高。对于延迟敏感的应用(如金融交易、实时计算、游戏服务),长时间的 STW 是不可接受的。
- 衡量指标:评估 GC 性能的两个核心指标都与 STW 有关:
- 吞吐量(Throughput):应用程序运行时间 / (应用程序运行时间 + GC 时间)。STW 时间越长,吞吐量越低。
- 延迟(Latency):单次 GC 停顿(STW)的持续时间。延迟越低,应用响应越快。
五、如何减少 STW 的影响?(GC 的演进目标)
现代垃圾收集器的核心优化方向之一就是尽可能地缩短 STW 的时间,甚至在某些阶段完全消除它。
-
并发收集:
- 思路:让垃圾收集器线程和应用程序线程同时工作。
- 代表:CMS、G1、ZGC、Shenandoah 等收集器都在标记阶段实现了并发,大大减少了 STW 的时间。它们在初始标记和重新标记阶段仍有短暂的 STW,但主要的标记工作是与应用线程并发进行的。
-
增量收集:
- 思路:将一次长时间的 STW 暂停,划分为多次短暂的暂停。
- 代表:早期的增量收集器,但效果不如并发收集。
-
选择低延迟收集器:
- 对于要求低延迟的应用,应选择以低延迟为设计目标的收集器:
- G1:可以设定预期的最大停顿时间目标(
-XX:MaxGCPauseMillis
)。 - ZGC / Shenandoah:革命性的收集器,其 STW 时间不再随堆大小或存活对象数量而增长,而是被控制在极短的亚毫秒级别(通常 < 1ms)。这是通过读屏障、染色指针等先进技术实现的。
- G1:可以设定预期的最大停顿时间目标(
- 对于要求低延迟的应用,应选择以低延迟为设计目标的收集器:
特性 | 说明 |
---|---|
STW 本质 | JVM 在进行垃圾回收时,暂停所有应用线程的现象。 |
产生原因 | 为了保证垃圾回收结果的正确性,避免应用线程与收集器并发修改对象引用。 |
主要影响 | 导致应用程序停顿,响应延迟增加。 |
优化方向 | 采用并发垃圾收集器(如 G1, ZGC, Shenandoah),将工作负载与应用线程并发执行,最大限度地缩短 STW 时间。 |
2025 面试题大全🔗