← 每日面试题 学习看板

什么是Stop The World?

面试题/00java/03JVM/04垃圾回收(GC)基础/什么是Stop The World?.md

面试记录 2026-09-21

题目:什么是Stop The World?

难度:low

标签:jvm/gc, general/knowledge, difficulty/low

评分:⭐⭐⭐☆☆(3/5)

我的回答

所谓 Stop the World 是为了垃圾回收的时候更好的进行垃圾回收。它的主要作用是停止创建对象,停止 JVM 的其他的活动,把所有的精力用在进行垃圾回收上。这时造成了一个情况,所有的 JVM 动作都停了,也就是 Stop the World,整个世界都停止了。它的核心作用就是在回收垃圾的时候,能够专注的去进行回收,线程不必考虑其他正在创建的,是否有对象在家,新建,是否有对象重建引用这些事。把当前整个状态暂停,所有的状态进行一个停止。这的是,这时候对所有的对象进行分析,是一个一致的状态,有引用就引用,没引用就没引用,可以明确的确定这个对象是否要被清理掉。这就演出了一个问题,当 Stop World 的时候,对整个线程影响太大了,整个服务影响太大了,所有的东西都停止了,所以就尽可能的控制,不让 JVM 发生这个 Stop World。后续考虑了很多方法,一个小量的去进行停止,一个是并行的去进行停止,也就是说没有停止,新目标是取消停止,一边回收垃圾,一边让它去正常的执行。但是这个情况导致了一些延伸的问题,当时 CWS。考虑就是这么方式去做,但是它处理得并不是很好,衍生了很多问题。同时处理的话会,它有一个配置是多次同时回收,回收出来不达不到比例的话,它会退化回单线程的回收。这时候反而会造成更大的影响。Stop the world 本质上其实是一种对于问题处理的相对简单的办法,它是一个衍生产物。暂时看,能尽量的只是缩短它,并没有能把它完全规避掉。哪怕到当下的这几期,也只是能控制它的短暂时间。类似于 CPU 切换,你使用的时候,终归会有一个短暂的暂停,并不会说完全的没有影响。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察 STW 的本质动机(状态一致性)+ 实现机制(Safepoint)+ 现代 GC 的演化方向。

知识点拆解:

  1. STW 的本质:状态一致性的锁
  1. STW 的实现:Safepoint 机制
  1. GC 中的 STW 阶段
  1. CMS 的退化:Concurrent Mode Failure
  1. STW 的极限:ZGC / Shenandoah
  1. STW 观测

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. Safepoint 是什么?为什么长方法会拖长 STW?
  1. CMS 为什么被弃用?G1/ZGC 有什么优势?
  1. 如何在线上定位长 STW 停顿?
  1. Full GC 一定 STW 吗?
  1. ZGC 的"多映射"是什么原理?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,Stop The World 的核心动机是"状态一致性"——GC 判断对象存活需要引用图,但线程不断修改引用图,如果不暂停就会竞态(引用指向刚被回收的对象、对象在标记中途被创建或销毁)。所以 STW 本质是"GC 和线程之间的互斥锁",用短暂停顿换分析的正确性。

实现机制是 Safepoint。JVM 通知线程跑到最近的安全点才暂停,安全点是字节码中的特定位置——方法调用、循环回跳、异常跳转。有个坑:长方法如果没有安全点,其他线程会一直等它跑完 safepoint,STW 被拖长。HotSpot 通过 -XX:LoopSafepointPollSize 自动在长循环插入 safepoint 检查。

GC 中具体哪些阶段 STW?

所以STW 主要集中在初始标记和重新标记两个阶段,G1 通过缩小 Region 让 Remark 范围更小。

并发 GC 会退化吗?——会的,这就是 Concurrent Mode Failure。比如 CMS 并发标记期间老年代空间不足,就退化为 Full GC,停顿从几十 ms 飙到秒级,这就是常说的"退化回单线程",是线上 GC 事故的常见根因。G1 通过可预测停顿(-XX:MaxGCPauseMillis)尽量避免退化。

STW 能完全消除吗?——目前不能完全消除。ZGC 通过读屏障+多映射(同一虚拟地址映射多个物理地址,移动对象时改映射而非改对象引用)把 STW 压到 <1ms;Shenandoah 用写屏障+Brooks 转发做到 <10ms。但 Full GC 触发(Metaspace 满、System.gc())仍是秒级,STW 更像"暂时性技术约束"而非"绝对不可能"。

线上怎么观测?-Xlog:gc* 打 GC 日志、JFR jdk.GCPhasePause 事件、Arthas dashboard、Prometheus + JVMExporter。生产上单次 STW > 200ms 或频繁 FullGC 都应该告警。

所以 STW 的哲学是:它不是可以回避的问题,而是可以用并发技术不断缩短的问题。从 Serial 的秒级,到 CMS 的百 ms 级,到 G1 的几十 ms,到 ZGC 的 <10ms,每一步都是并发技术对 STW 的极限压缩,但都不是消除。