STW停顿过长本质是JVM执行GC根扫描、对象复制或安全点同步时等待过久或处理开销过大;需通过高精度日志归类GC类、安全点类、偏向锁类STW,再针对性优化大对象晋升、跨代引用、伪STW等高频根因。

STW 停顿时间过长,本质是 JVM 在执行关键操作(如 GC 根扫描、对象复制、安全点同步)时被迫等待或处理开销过大。排查不能只盯“停了多久”,而要定位“为什么停这么久”——是 GC 策略失配、对象行为异常,还是非 GC 类型的全局停顿在干扰?优化需分层推进:先稳住日志基础,再聚焦高频根因,最后收口应用层习惯。
统一开启高精度 STW 日志采集
没有结构化日志,所有分析都是盲猜。必须确保全集群使用生产级日志参数,且覆盖 GC 阶段与 Safepoint 行为:
- JDK 17/21 推荐统一用:
-Xlog:gc*,gc+phases=debug,safepoint=info:file=/data/logs/jvm/gc-%t.log:time,uptime,pid:filecount=10,filesize=100M - JDK 8 必须包含:
-XX:+PrintGCApplicationStoppedTime -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 - 关键验证点:日志中是否出现 “Total time for which application threads were stopped” 字样(真实 STW 总耗时),以及 safepoint reason 是否含 RevokeBias、GenCollectForAllocation 等明确类型
区分 STW 类型,锁定主导因素
不同来源的 STW,解决路径完全不同。先通过日志和工具快速归类:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- GC 类 STW:看日志中 “Pause (G1 Evacuation Pause)” 或 “Full GC” 字段,结合 jstat -gc 输出中的 FGCT(Full GC 总耗时)和 YGCT(Young GC 总耗时)判断占比。若单次 Mixed GC > 300ms,重点查 Evacuation Failure 或 Update RS 耗时是否超 40%
- 安全点同步类 STW:观察 PrintSafepointStatistics 输出中 spin 和 block 时间。若 spin 时间长(>5ms),说明线程响应慢,常见于 CPU 过载或大量 native 调用;若 block 时间长,说明有线程卡在 safepoint 入口(如长时间 synchronized、IO 等待)
- 偏向锁撤销类 STW:日志中频繁出现 RevokeBias 或 BulkRevokeBias,且伴随大量线程堆栈卡在 ObjectSynchronizer::fast_enter,应立即关闭 -XX:-UseBiasedLocking
针对性优化三类高频根因
多数长停顿可归结为以下三类行为,对应调整成本低、见效快:
立即学习“Java免费学习笔记(深入)”;
- 大对象与隐式晋升:避免 PretenureSizeThreshold 设得过小(如默认 0),导致中等对象直接进老年代;调低 -XX:MaxTenuringThreshold=6,防止 Survivor 区挤满后对象批量晋升;用 jmap -histo 检查高频大数组(byte[]、String)、集合类实例数
- 跨代引用爆炸:G1 中 Update RS 耗时高,说明老年代对象频繁持有新生代引用。检查静态缓存(ConcurrentHashMap)、ThreadLocal 存储是否长期持有了短命 DTO;考虑增大 -XX:G1RSetUpdatingPauseTimePercent(默认 10),允许更多时间用于 remembered set 更新
- 伪 STW 干扰:Logback 的 MDC 若每次请求 new Map、Lombok @Data 自动生成 hashCode()、JSON 序列化未重写 equals/hashCode,都会触发偏向锁撤销或额外 safepoint。改用 ThreadLocal
验证是否真正生效
别只看平均值,毛刺才是业务感知的关键:
- 用 jstat -gc -h10 <pid> 1000 持续采样,观察 G1YGC/G1FGC 的单次耗时分布,重点关注 P95 和最大值是否下降
- 在 Grafana 中叠加 jvm_gc_pause_seconds_count{action="endOfMajorGC"} 与 http_server_requests_seconds_p95,确认 STW 峰值是否仍与业务延迟尖刺强相关(命中率 >10% 即需继续优化)
- 对比调优前后 GC 日志中 Ext Root Scanning 和 Reference Processing 的绝对耗时,若两者之和下降 30% 以上,说明根因定位准确

















