每日面试题13:垃圾回收器什么时候STW?

STW是什么?——深入理解JVM垃圾回收中的"Stop-The-World"

在Java程序运行过程中,JVM会通过垃圾回收(GC)自动管理内存,释放不再使用的对象以腾出空间。但你是否遇到过程序突然卡顿的情况?这可能与GC过程中的​​Stop-The-World(STW,全局停顿)​​有关。本文将围绕"GC何时STW"展开,重点解析CMS与G1回收器的STW机制,并结合三色标记法说明其必要性。


一、STW的本质与核心作用

​Stop-The-World(STW)​​ 是JVM在垃圾回收过程中,为保证内存回收的​​正确性​​和​​一致性​​,临时暂停所有应用线程(User Thread)执行的现象。简单来说,就是"世界停止了",只有GC线程在工作。

为什么需要STW?

垃圾回收的核心是​​准确区分存活对象与可回收对象​​。若应用线程在GC过程中继续运行,可能导致:

  • ​对象状态变更​​:应用线程可能修改对象的引用关系(如创建新对象、销毁旧对象、修改指针指向),导致GC标记结果失效;
  • ​数据不一致​​:若GC线程与应用线程同时操作同一块内存,可能引发竞态条件(Race Condition),破坏内存管理的准确性。

因此,STW是GC保证自身逻辑正确的"保护机制",但过长或频繁的STW会显著降低程序性能(尤其是对延迟敏感的应用)。


二、三色标记法:GC标记对象的"通用语言"

无论是CMS还是G1,GC标记阶段均基于​​三色标记法​​(Tri-Color Marking)实现。这是一种通过颜色标记对象存活状态的并发标记算法,三种颜色含义如下:

颜色含义
白色未被GC线程访问过的对象,默认视为"可回收垃圾"(未被标记)。
灰色已被GC线程访问过,但其​​引用的其他对象​​尚未处理(待遍历的"边界"对象)。
黑色已被GC线程完整处理(自身标记为存活,且所有引用对象也已处理),确认"存活"。
标记过程的关键:

GC线程从GC Roots(如栈帧局部变量、静态变量、JNI引用等)出发,将直接关联的对象标记为灰色(初始阶段);随后递归处理灰色对象的引用,将其目标对象标记为灰色,自身升级为黑色(并发阶段)。最终未被标记为黑色的白色对象将被回收。

但三色标记法存在一个天然缺陷:​​若应用线程在标记过程中修改了对象的引用关系(如删除灰色对象到白色对象的引用),可能导致白色对象被错误回收(漏标)​​。因此,GC需要通过STW阶段修正这些变动。


三、CMS回收器的STW阶段解析

CMS(Concurrent Mark-Sweep,并发标记-清除)是早期的并发GC算法,目标是​​减少STW时间​​,适用于对延迟敏感的场景。其核心流程包含4个阶段,其中​​初始标记​​和​​重新标记​​需要STW,其余阶段与应用线程并发执行。

1. 初始标记(Initial Mark,STW)
  • ​目标​​:快速标记GC Roots直接关联的对象(即从GC Roots出发的第一层可达对象)。
  • ​STW原因​​:需暂停所有应用线程,确保标记的准确性(避免应用线程在此时修改GC Roots的引用关系)。
  • ​耗时​​:非常短暂(通常仅毫秒级),因为仅标记直接关联对象。
2. 并发标记(Concurrent Mark,并发)
  • ​目标​​:从初始标记的灰色对象出发,递归遍历所有可达对象,将其标记为黑色(存活)。
  • ​STW状态​​:与应用线程并发执行(不暂停)。
  • ​风险​​:若应用线程在并发标记期间修改了对象的引用关系(如删除灰色对象到白色对象的引用),可能导致部分存活对象被漏标为白色。
3. 重新标记(Remark,STW)
  • ​目标​​:修正并发标记阶段因应用线程运行导致的标记变动(如漏标、错标)。
  • ​STW原因​​:需暂停应用线程,确保所有标记变动被正确处理(例如,通过"增量更新"算法记录并发期间的引用变更,重新扫描这些变更的对象)。
  • ​耗时​​:比初始标记长,但远短于完全串行的标记过程(通常为初始标记的数倍)。
4. 并发清除(Concurrent Sweep,并发)
  • ​目标​​:回收未被标记的白色对象(垃圾),释放内存空间。
  • ​STW状态​​:与应用线程并发执行(不暂停)。
  • ​特点​​:CMS采用"标记-清除"算法,因此不会移动存活对象,可能导致内存碎片(长期运行后可能引发Full GC)。
CMS的STW总结:

CMS通过并发标记和清除大幅减少了STW时间,但初始标记和重新标记仍需短暂停顿。其STW总耗时通常在10ms~100ms级别(取决于堆大小和对象复杂度)。


四、G1回收器的STW阶段解析

G1(Garbage-First)是JDK9及以后默认的GC算法,设计目标是​​平衡吞吐量与延迟​​(支持设置最大停顿时间)。与CMS不同,G1将堆划分为多个独立的Region(默认2MB~32MB),并通过"标记-整理"思想优化内存布局。其核心流程同样包含4个阶段,但STW的触发逻辑与CMS有显著差异。

1. 初始标记(Initial Mark,STW)
  • ​目标​​:标记GC Roots直接关联的对象,并记录每个Region中"已存活对象"的数量(用于后续回收价值排序)。
  • ​STW状态​​:与应用线程并发执行(仅标记GC Roots直接关联的对象,耗时极短)。
  • ​特点​​:G1的初始标记通常与Minor GC(年轻代GC)合并执行,进一步减少STW时间。
2. 并发标记(Concurrent Mark,并发)
  • ​目标​​:递归标记所有可达对象,统计每个Region的存活对象比例。
  • ​STW状态​​:与应用线程并发执行(不暂停)。
  • ​优化​​:G1通过"SATB(Snapshot-At-The-Beginning)"算法记录初始标记时的对象快照,即使后续应用线程修改引用关系,也能通过对比快照修正标记(减少漏标)。
3. 最终标记(Final Mark,STW)
  • ​目标​​:处理并发标记阶段SATB快照中未被处理的变动(如新增的白色对象),确保标记结果最终准确。
  • ​STW状态​​:与应用线程短暂并发(仅扫描SATB队列中的变更,耗时通常在1ms~5ms)。
4. 筛选回收(Live Data Counting and Evacuation,STW)
  • ​目标​​:根据各Region的存活对象比例和回收价值(存活对象越少、Region越小,回收价值越高),选择部分Region进行回收,并将存活对象移动到其他Region(整理内存)。
  • ​STW原因​​:需暂停应用线程,确保存活对象移动过程的原子性(避免应用线程访问正在移动的对象)。
  • ​耗时​​:取决于需要回收的Region数量(若仅回收少量Region,STW可控制在10ms以内)。
G1的STW总结:

G1的STW主要集中在初始标记、最终标记和筛选回收阶段,但通过并发标记和SATB算法大幅缩短了单次STW的时间。由于G1支持"增量回收"(每次只回收部分Region),其平均STW时间可控制在用户设定的阈值内(如不超过200ms)。


五、CMS与G1的STW对比

维度CMSG1
​STW阶段​初始标记、重新标记初始标记、最终标记、筛选回收
​单次STW时长​较长(重新标记可能达百毫秒级)更短(筛选回收可通过Region选择优化)
​内存碎片​标记-清除算法导致碎片积累标记-整理算法避免碎片
​适用场景​老年代小堆(<8GB),对延迟敏感大堆(>8GB),需平衡吞吐量与延迟

总结

STW是GC保证正确性的必要代价,但通过优化标记算法(如三色标记+SATB)和并发设计(如CMS的并发标记、G1的Region划分),现代GC已将STW时间控制在可接受范围内。理解不同回收器的STW阶段,有助于我们在实际开发中根据业务需求(如延迟敏感型或吞吐量优先型)选择合适的GC算法,并通过JVM参数调优(如-XX:+UseConcMarkSweepGC-XX:+UseG1GC)进一步降低停顿时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90465.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【系统全面】常用SQL语句大全

一、基本查询语句 查询所有数据&#xff1a; SELECT * FROM 表名;查询特定列&#xff1a; SELECT 列名1, 列名2 FROM 表名;条件查询&#xff1a; SELECT * FROM 表名 WHERE 条件;模糊查询&#xff1a; SELECT * FROM 表名 WHERE 列名 LIKE 模式%;排序查询&#xff1a; SELECT *…

Spring之SSM整合流程详解(Spring+SpringMVC+MyBatis)

Spring之SSM整合流程详解-SpringSpringMVCMyBatis一、SSM整合的核心思路二、环境准备与依赖配置2.1 开发环境2.2 Maven依赖&#xff08;pom.xml&#xff09;三、整合配置文件&#xff08;核心步骤&#xff09;3.1 数据库配置&#xff08;db.properties&#xff09;3.2 Spring核…

C++STL系列之set和map系列

前言 set和map都是关联式容器&#xff0c;stl中树形结构的有四种&#xff0c;set&#xff0c;map&#xff0c;multiset,multimap.本次主要是讲他们的模拟实现和用法。 一、set、map、multiset、multimap set set的中文意思是集合&#xff0c;集合就说明不允许重复的元素 1……

Linux 磁盘挂载,查看uuid

lsblk -o NAME,FSTYPE,LABEL,UUID,MOUNTPOINT,SIZEsudo ntfsfix /dev/nvme1n1p1sudo mount -o remount,rw /dev/nvme1n1p1 /media/yake/Datasudo ntfsfix /dev/sda2sudo mount -o remount,rw /dev/sda2 /media/yake/MyData

【AJAX】XMLHttpRequest、Promise 与 axios的关系

目录 一、AJAX原理 —— XMLHttpRequest 1.1 使用XMLHttpRequest 二、 XMLHttpRequest - 查询参数 &#xff08;就是往服务器后面拼接要查询的字符串&#xff09; 三、 地区查询 四、 XMLHttpRequest - 数据提交 五、 认识Promise 5.1 为什么 JavaScript 需要异步&#…

C++中的stack和queue

C中的stack和queue 前言 这一节的内容对于stack和queue的使用介绍会比较少&#xff0c;主要是因为stack和queue的使用十分简单&#xff0c;而且他们的功能主要也是在做题的时候才会显现。这一栏目暂时不会写关于做题的内容&#xff0c;后续我会额外开一个做题日记的栏目的。 这…

Spring Bean生命周期七步曲:定义、实例化、初始化、使用、销毁

各位小猿&#xff0c;程序员小猿开发笔记&#xff0c;希望大家共同进步。 引言 1.整体流程图 2.各阶段分析 1️⃣定义阶段 1.1 定位资源 Spring 扫描 Component、Service、Controller 等注解的类或解析 XML/Java Config 中的 Bean 定义 1.2定义 BeanDefinition 解析类信息…

API安全监测工具:数字经济的免疫哨兵

&#x1f4a5; 企业的三重致命威胁 1. 漏洞潜伏的定时炸弹 某支付平台未检测出API的批量数据泄露漏洞&#xff0c;导致230万用户信息被盗&#xff0c;面临GDPR 1.8亿欧元罚单&#xff08;IBM X-Force 2024报告&#xff09;。传统扫描器对逻辑漏洞漏检率超40%&#xff08;OWASP基…

Matplotlib详细教程(基础介绍,参数调整,绘图教程)

目录 一、初识Matploblib 1.1 安装 Matplotlib 1.2、Matplotlib 的两种接口风格 1.3、Figure 和 Axes 的深度理解 1.4 设置画布大小 1.5 设置网格线 1.6 设置坐标轴 1.7 设置刻度和标签 1.8 添加图例和标题 1.9 设置中文显示 1.10 调整子图布局 二、常用绘图教程 2…

Redis高可用架构演进面试笔记

1. 主从复制架构 核心概念Redis单节点并发能力有限&#xff0c;通过主从集群实现读写分离提升性能&#xff1a; Master节点&#xff1a;负责写操作Slave节点&#xff1a;负责读操作&#xff0c;从主节点同步数据 主从同步流程 全量同步&#xff08;首次同步&#xff09;建立连接…

无人机保养指南

定期清洁无人机在使用后容易积累灰尘、沙砾等杂物&#xff0c;需及时清洁。使用软毛刷或压缩空气清除电机、螺旋桨和机身缝隙中的杂质。避免使用湿布直接擦拭电子元件&#xff0c;防止短路。电池维护锂电池是无人机的核心部件&#xff0c;需避免过度放电或充电。长期存放时应保…

vlm MiniCPM 学习部署实战

目录 开源地址&#xff1a; 模型repo下载&#xff1a; 单图片demo&#xff1a; 多图推理demo&#xff1a; 论文学习笔记&#xff1a; 部署完整教程&#xff1a; 微调教程&#xff1a; 部署&#xff0c;微调教程&#xff0c;视频实测 BitCPM4 技术报告 创意&#xff1…

92套毕业相册PPT模版

致青春某大学同学聚会PPT模版&#xff0c;那些年我们一起走过的岁月PPT模版&#xff0c;某学院某班同学联谊会PPT模版&#xff0c;匆匆那年PPT模版&#xff0c;青春的纪念册PPT模版&#xff0c;栀子花开PPT模版&#xff0c;毕业纪念册PPT模版。 92套毕业相册PPT模版&#xff1…

爬虫基础概念

网络爬虫概述 概念 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网络蜘蛛&#xff08;Web Spider&#xff09;或机器人&#xff08;Bot&#xff09;&#xff0c;是一种自动化程序&#xff0c;用于系统地浏览互联网并收集网页信息。它模拟人类浏览器行为&…

java8 stream流操作的flatMap

我们来详细解释一下 Java 8 Stream API 中的 flatMap 操作。理解 flatMap 的关键在于将其与 map 操作进行对比。​​核心概念&#xff1a;​​​​map 操作&#xff1a;​​作用&#xff1a;将一个流中的每个元素​​转换​​为另一个元素&#xff08;类型可以不同&#xff09;…

开源UI生态掘金:从Ant Design二次开发到行业专属组件的技术变现

开源UI生态掘金&#xff1a;从Ant Design二次开发到行业专属组件的技术变现内容摘要在开源UI生态中&#xff0c;Ant Design作为一款广受欢迎的UI框架&#xff0c;为开发者提供了强大的基础组件。然而&#xff0c;面对不同行业的特定需求&#xff0c;仅仅依靠现有的组件往往难以…

Object Sense (OSE):一款从编辑器脚本发展起来的编程语言

引言&#xff1a;从Vim编辑器走出的语言在编程语言的世界里&#xff0c;许多革命性的创新往往源于看似简单的工具。Object Sense&#xff08;简称OSE&#xff09;的诞生&#xff0c;便与一款经典文本编辑器——Vim息息相关。它的前身是Vim的脚本语言VimL&#xff08;Vimscript&…

我考PostgreSQL中级专家证书二三事

1. 为什么选择PGCE&#xff1f;PostgreSQL的开源特性、高性能和高扩展性早已让我心生向往&#xff0c;而PGCE认证不仅是对技术能力的认可&#xff0c;更是一张通往更高职业舞台的“通行证”。官方资料提到&#xff0c;PGCE考试涵盖性能优化、高可用架构、复杂查询处理、内核原理…

Java 动态导出 Word 登记表:多人员、分页、动态表格的最佳实践

本文详细讲解如何使用 Java 动态导出包含多人员报名表的 Word 文档&#xff0c;每人占据独立一页&#xff0c;并支持动态表格行&#xff08;如个人经历&#xff09;。我们对比了多种实现方案&#xff0c;最终推荐基于 Freemarker XML 模板 或 docx4j 的灵活方式&#xff0c;并…

【element-ui el-table】多选表格勾选时默认勾选了全部,row-key绑定异常问题解决

项目场景&#xff1a; Element-UI的el-table组件row-key使用问题 同一个页面使用了几个table&#xff0c;这几个table都使用了多选&#xff0c;row-key属性&#xff0c;其中row-key的绑定方式都是用的静态绑定&#xff0c;row-key“username”或row-key“id”&#xff0c;可正常…