JVM中CMS收集器的四大核心步骤:初始标记、并发标记、重新标记与并发清除

小杰酱_5012

小杰酱_5012

2026-08-12

352人浏览

原创

cms收集器的四大核心步骤是初始标记(stw,快速标记gc roots直达对象)、并发标记(与用户线程并发,遍历引用链)、重新标记(stw,修正并发变动)、并发清除(并发回收未标记对象)。

jvm中cms收集器的四大核心步骤:初始标记、并发标记、重新标记与并发清除

CMS收集器的四大核心步骤,本质是围绕“低停顿”目标,在标记-清除算法框架下,把原本需要全程STW(Stop-The-World)的工作拆解为尽量并发执行的阶段。关键不在于步骤数量,而在于哪些阶段必须暂停用户线程、哪些可以并行运行,以及各阶段要解决什么实际问题。

初始标记:快速抓取根直达对象

这个阶段只标记GC Roots直接关联的对象(比如线程栈里的局部变量、静态字段、JNI引用等),不递归遍历。范围小、速度快,通常几毫秒到百毫秒内完成,但必须STW。它为后续并发标记提供一个可靠的起点集合——即“已知存活”的种子对象。

  • GC Roots包括:虚拟机栈中引用的对象、方法区中的静态变量、本地方法栈中的JNI引用、被同步锁持有的对象
  • JDK 8起默认启用并行初始标记(可通过-XX:+CMSParallelInitialMarkEnabled显式控制)
  • 若老年代很大但GC Roots极少(如大量静态常量未引用新对象),该阶段依然很轻量

并发标记:边跑业务边画存活图

从初始标记得到的“种子”出发,沿着所有引用链遍历整个老年代对象图,逐个标记可达对象。这个过程与用户线程完全并发,不暂停应用,但耗时最长(可能几百毫秒到数秒),且会占用CPU资源。

MAC风格响应式蓝色企业CMS后台管理系统模版
MAC风格响应式蓝色企业CMS后台管理系统模版

MAC风格响应式蓝色企业CMS后台管理系统模版

下载
  • 标记过程本身不修改堆结构,只更新对象头的mark bit或使用额外位图
  • 用户线程在此期间可能修改引用关系(如赋值、断引用),导致部分对象状态“滞后”
  • 这是CMS能大幅降低总停顿时间的主因——最耗时的部分交给了并发执行

重新标记:补漏,应对并发带来的变动

由于并发标记期间用户线程持续运行,对象引用关系可能发生变化(例如A指向B,之后A改为指向C,B就可能变成垃圾但未被标记)。重新标记阶段会STW,扫描那些在并发标记中“逃逸”的变动,确保标记结果准确。

  • 主要扫描两类区域:被用户线程修改过的卡表(Card Table)、年轻代中晋升到老年代的新对象
  • 耗时比初始标记长,但远短于并发标记;可通过-XX:+CMSScavengeBeforeRemark提前清理年轻代,减少需扫描范围
  • 这是CMS中停顿时间最长的一次STW,优化重点常落在缩短它上

并发清除:边清垃圾边继续服务

根据前两轮标记的结果,直接回收所有未被标记的对象内存。不移动存活对象,所以不需要更新引用地址,可全程与用户线程并发执行。

  • 清除操作只是将内存块加入空闲链表或更新空闲位图,开销相对可控
  • 清除过程中产生的新垃圾(如用户线程刚创建又丢弃的对象)称为“浮动垃圾”,只能等到下次GC周期处理
  • 因不整理内存,长期运行易产生碎片;当无法分配大对象时,可能触发Full GC(退化为Serial Old)

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

cms

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

2026.10.21

0

15

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

2026.10.21

0

16

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

2026.10.21

0

16

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

100

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

80

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

40

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

40

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

20

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

40

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程