STW 全称是:Stop The World
👉 意思是:当 JVM 进行某些操作时,会暂停所有的应用线程,只执行 GC 线程,直到操作完成后再恢复应用线程的执行。
🔍 为什么会发生 STW?
主要出现在以下几种场景:
场景 | 说明 |
---|---|
✅ 垃圾回收(GC) | 所有 GC 都会有 STW,只是时间长短不同 |
✅ JIT 编译 | 即时编译优化代码,也会暂停 |
✅ Full GC | 比较重的 GC,会导致长时间 STW |
✅ 类加载/Class Metadata | 某些元信息变动 |
⏱ STW 对程序的影响?
-
会暂停业务线程
-
如果 GC 时间长,会导致:
-
页面卡顿
-
服务响应慢
-
严重时服务超时甚至雪崩
-
♻️ 各种回收器的 STW 特性对比
回收器 | 是否 STW | STW 时间长短 |
---|---|---|
Serial | ✅ 是 | 很长(单线程) |
Parallel | ✅ 是 | 快一些(多线程) |
CMS | ✅ 部分阶段 | 标记阶段 STW,清理并发 |
G1 | ✅ 是,但可控 | 停顿分段进行,时间短 |
ZGC / Shenandoah | ✅ 极短 | 目标 <10ms,适合极端低延迟系统 |
🎯 面试怎么回答 STW?
✍️ 推荐回答模板:
STW(Stop The World)是 JVM 中暂停所有业务线程、仅执行 GC 线程的机制,常见于垃圾回收、类加载、JIT 编译等场景。所有 GC 都会触发 STW,只是停顿时间不同。
我们项目中曾经遇到过 Full GC 导致 2~3 秒 STW,后来通过 G1 替换 CMS 并优化堆配置,把最大停顿时间控制在了 300ms 以内。
✅ 实战技巧:如何减少 STW 停顿?
-
使用 G1、ZGC 这类低停顿回收器
-
设置最大停顿目标:
-XX:MaxGCPauseMillis=200
-
合理分配堆内存,避免频繁 Full GC
-
开启 GC 日志,分析 STW 时间:
-Xlog:gc*