讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中StopTheWorld是什么意思_Java垃圾回收影响解析

老雪大大_6812

老雪大大_6812

发布时间:2026-01-18 14:33:08

|

958人浏览过

|

来源于php中文网

原创

StopTheWorld(STW)是JVM执行关键GC操作时强制暂停所有应用线程的行为,源于堆一致性与对象可达性判定的必要性;不同收集器STW时长差异大,G1为毫秒级、ZGC控制在1ms内、Serial/Parallel则全程STW;无法彻底消除,但可通过调优显著压缩。

在java中stoptheworld是什么意思_java垃圾回收影响解析

StopTheWorld 是什么,为什么它必然发生

StopTheWorld(STW)不是某个 API 或配置项,而是 JVM 在执行某些关键操作(主要是部分 GC 阶段)时,**强制暂停所有应用线程**的行为。它不是 bug,也不是可选开关——只要用了分代回收、需要对象图一致性或堆结构变更,JVM 就必须 STW。

根本原因在于:GC 线程和 Java 应用线程并发访问堆内存时,若不冻结应用线程,就无法安全判断哪些对象还被引用、哪些可以回收。比如 CMS 的初始标记、G1 的 Evacuation 阶段、ZGC 的 Relocation 准备阶段,都依赖“那一刻的堆快照”。

不同垃圾收集器的 STW 时长差异极大

STW 时间不是由“是否触发 GC”决定,而是由**收集器类型 + 堆大小 + 存活对象数量 + GC 触发时机**共同决定。以下为典型表现:

  • G1:默认启用 -XX:+UseG1GC 后,大部分阶段并发,但 Initial Mark 和 Evacuation(即 Mixed GC 中的实际复制)仍需 STW;一次 Mixed GC 的 STW 通常在几毫秒到几十毫秒,但大堆(>32GB)+ 高存活率下可能突破 100ms
  • ZGC:设计目标是 STW 不超过 10ms,实际中绝大多数 STW(如 Pause GC)控制在 1ms 内,但前提是堆不超过 16TB 且未开启 -XX:+UnlockExperimentalVMOptions 下的不稳定选项
  • Serial / Parallel:全程 STW,ParallelGC 虽并行处理,但整个 Young GC 或 Full GC 过程仍会停掉所有应用线程;一次 Full GC 在 4GB 堆上可能卡住 500ms 以上

如何定位一次 GC 是否引发了不可接受的 STW

不能只看 GC log 里有没有 pause 字样——所有 GC 日志中的 pause 都代表 STW 发生。关键看时长和频率:

立即学习“Java免费学习笔记(深入)”;

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
-Xlog:gc*:file=gc.log:time,tags,level -Xlog:safepoint*:file=safepoint.log:time,tags

重点关注日志中类似这样的行:

[2024-04-10T10:23:45.678+0800][info][gc,phases] GC(123) Pause Young (Normal) (G1 Evacuation Pause) 123M->45M(1024M) 42.323ms

其中 42.323ms 就是本次 STW 持续时间。同时检查 safepoint.log,确认是否因 no vm operation 或 revoke bias 导致额外 safepoint 延迟——这些也会表现为“伪 STW”,让应用线程卡在进入 safepoint 的路上。

能关掉 STW 吗?不能,但可以大幅压缩它

没有收集器能完全消除 STW(ZGC 和 Shenandoah 也只是把 STW 压到亚毫秒级,且仍存在),但你可以通过以下方式显著降低影响:

  • 避免 System.gc() 或 Runtime.getRuntime().gc() ——它们会强制触发 Full GC,带来长 STW
  • 调小 -XX:MaxGCPauseMillis(仅对 G1/ZGC 有效),但不要设得比实际能力低太多,否则 GC 频次会飙升
  • 减少大对象直接进入老年代(避免 -XX:PretenureSizeThreshold 误配),防止老年代碎片化引发频繁 Full GC
  • 用 -XX:+UseStringDeduplication(G1)或 -XX:+UseShenandoahGC 替代 ParallelGC,对字符串多、长生命周期对象多的场景更友好

真正棘手的从来不是“有没有 STW”,而是 STW 发生在请求链路的关键路径上(比如支付扣款接口正在等数据库响应时突然被 GC 卡住 80ms)。这时候光换收集器不够,得结合异步化、缓冲队列、降级策略一起压测验证。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2824

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5909

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7534

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11174

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5739

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

6307

2025.08.07

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn