CMS(Concurrent Mark Sweep)收集器:并发标记清除的实现与瓶颈

酷辰大大_9097

酷辰大大_9097

2026-07-16

354人浏览

原创

cms收集器的核心目标是获取最短回收停顿时间,通过初始标记、并发标记、重新标记、并发清除四阶段,仅两次极短stw,其余阶段与用户线程并发执行,采用标记-清除算法导致内存碎片。

cms(concurrent mark sweep)收集器:并发标记清除的实现与瓶颈

CMS收集器的核心目标不是“快”,而是“不打断”——它把最耗时的标记和清除动作挪到用户线程运行的同时去做,只保留两次极短暂停(初始标记、重新标记),从而把老年代GC停顿压到毫秒级。这种设计适合B/S类对响应延迟敏感、CPU资源较充裕、对象生命周期相对稳定的系统。

四个关键阶段如何协同降低停顿

整个流程围绕“并发”展开,但并非全程无停顿:

  • 初始标记:仅扫描GC Roots直接关联对象(如栈中引用、静态变量、JNI引用)+ 新生代中存活且引用老年代的对象。JDK 8起默认多线程执行,通常
  • 并发标记:GC线程与用户线程交替执行(非严格并行),用三色标记法+增量更新机制持续追踪可达对象。用户请求照常处理,延迟略有上升,但不卡顿。
  • 重新标记:修正并发期间因引用变更导致的漏标。需STW,但范围可控——主要扫描“脏卡页”(Card Table中标记为dirty的老年代区域)和新生代,而非全堆扫描。配合-XX:+CMSScavengeBeforeRemark可提前触发YGC,减少其工作量。
  • 并发清除:仅遍历标记位图,将未标记内存块归还空闲链表。不移动对象、不更新引用,因此完全无STW。本轮产生的新垃圾(浮动垃圾)留待下次处理。

并发带来的明确代价

低停顿不是免费的,CMS通过资源换时间:

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

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

下载
  • CPU占用高:默认启用(CPU核数 + 3) / 4个回收线程。在2核机器上占50% CPU,在4核机器上约25%,直接影响吞吐量。
  • 内存碎片累积:“标记-清除”不整理空间,长期运行后老年代易出现大量不连续空闲块,大对象分配失败会触发Concurrent Mode Failure,退化为Serial Old单线程Full GC,反而造成秒级停顿。
  • 浮动垃圾无法处理:并发阶段用户线程持续分配,新产生的垃圾不在本轮清理范围内,需靠预留空间缓冲。若老年代使用率超阈值(默认92%,可通过-XX:CMSInitiatingOccupancyFraction调低),就可能因空间不足而失败。

两种运行模式与典型风险

CMS实际有Background(常规并发)和Foreground(退化兜底)两种模式:

  • Background模式是理想路径:含初始标记→并发标记→并发预处理→可中止预处理→重新标记→并发清除六步,其中预处理阶段主动扫描脏卡页、触发YGC等,都是为缩短重新标记STW时间。
  • Foreground模式是故障路径:当并发失败发生(如老年代填满、浮动垃圾过多、CPU争抢严重),JVM会强制切换至Serial Old,全程STW,停顿不可控。这是CMS最需规避的场景。
  • 常见诱因包括:CMSInitiatingOccupancyFraction设得过高、年轻代过小导致频繁晋升、大对象直接进老年代、系统CPU长期饱和等。

适用边界与现实取舍

CMS不是万能低延迟方案,它只在特定条件下优势明显:

  • 适合:Web服务端、API网关、交易中间件等强交互、容忍一定吞吐下降、有2核以上且负载可控的环境。
  • 不适合:计算密集型批处理、嵌入式设备、单核或CPU常年90%+的系统;JDK 9起已废弃,JDK 14彻底移除,新项目应优先考虑G1或ZGC。
  • 调优重点不在“加快GC”,而在“稳住并发”:合理设置触发比例、增大年轻代减缓晋升、监控concurrent mode failure次数、避免大对象冲击老年代。

相关文章

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

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

下载

相关标签:

cms

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

相关专题

更多
PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

2026.10.10

20

15

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

2026.10.10

20

15

Kratos框架Protobuf接口定义与代码生成合集
Kratos框架Protobuf接口定义与代码生成合集

本专题讲解Kratos框架接口定义体系,涵盖proto编写规范、proto add/client/server生成命令、http注解路由、validate校验、OpenAPI文档生成、跨服务proto复用与兼容性设计。

2026.10.10

0

15

C++虚函数怎么定义和调用
C++虚函数怎么定义和调用

C++虚函数是实现运行时多态的重要机制。本专题从virtual关键字的基本用法入手,介绍基类与派生类之间的函数重写、基类指针调用派生类方法,以及动态绑定的执行过程,帮助初学者掌握虚函数的核心语法。

2026.10.10

20

26

C++类与对象的封装方法教程
C++类与对象的封装方法教程

C++封装是面向对象编程的核心特性之一,通过类将数据与操作数据的函数组织在一起,并利用访问权限控制外部访问。本专题介绍类的定义、成员变量、成员函数以及public、private和protected的使用方法,帮助初学者掌握封装的基本原理。

2026.10.10

0

32

C++构造函数定义与调用方法
C++构造函数定义与调用方法

C++构造函数用于初始化类对象,是面向对象编程的重要基础。本专题从构造函数的定义、声明和调用入手,介绍默认构造函数、带参数构造函数、拷贝构造函数及成员初始化列表,帮助初学者掌握对象创建与初始化的基本方法。

2026.10.10

20

16

Kratos框架零基础入门教程
Kratos框架零基础入门教程

本专题整理Kratos框架入门内容,涵盖Go环境准备、kratos CLI安装升级、new命令创建项目、目录结构分层说明、服务启动与双协议端口、依赖下载报错排查,帮助开发者快速跑通第一个Kratos框架微服务应用。

2026.10.10

20

15

C++条件判断语句怎么写
C++条件判断语句怎么写

C++条件判断是控制程序执行流程的重要基础。本专题介绍if、if-else、else if和switch等常见分支语句,结合条件表达式、比较运算符与代码示例,帮助初学者掌握不同场景下的判断逻辑。

2026.10.10

0

13

C++变量怎么声明和赋值
C++变量怎么声明和赋值

C++变量是编写程序和存储数据的基础。本专题围绕变量声明、定义、初始化、赋值和类型选择等内容展开,帮助初学者理解不同变量的用法,并掌握在实际代码中定义和使用变量的方法。

2026.10.10

20

20

热门下载

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

精品课程

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