Java虚拟机:CMS垃圾回收器
在 Java 虚拟机JVM的众多垃圾回收器中CMSConcurrent Mark Sweep是一个经典且具有里程碑意义的设计。它主要服务于对响应时间敏感的应用希望在垃圾回收过程中尽可能减少应用程序的停顿Stop-The-World, STW时间。本文将从 CMS 的设计目标、核心工作阶段、关键参数、日志分析以及优缺点等多个维度带你彻底吃透 CMS 回收器。1. CMS 是什么为什么需要它全称Concurrent Mark Sweep并发标记清除核心目标获取最短的回收停顿时间。适用场景互联网网站、B/S 系统服务端等对响应速度要求高的应用。与 ParallelGC并行回收器不同ParallelGC 追求高吞吐量在 GC 时会暂停所有应用线程而 CMS 追求低延迟它的大部分工作阶段都可以和用户线程并发执行因此整体停顿时间更短。2. CMS 的六大工作阶段图文详解CMS 的回收过程非常精细总共分为6 个步骤其中只有初始标记和重新标记需要 STW其余阶段均可与应用程序并发执行。下图清晰展示了 CMS 的工作流程标注STW的为停顿阶段阶段名称类型主要工作1. 初始标记 (Initial Mark)STW标记根对象GC Roots直接引用的对象速度很快。2. 并发标记 (Concurrent Mark)并发从根对象开始遍历整个老年代标记所有存活对象。此阶段时间长但应用线程可继续运行。3. 预清理 (PreClean)并发在重新标记之前提前处理一些并发标记阶段变化的对象目的是缩短后续 STW 时间。4. 重新标记 (Remark)STW修正并发标记期间因用户程序运行而发生变化的那部分对象标记。这是 CMS 中最耗时的停顿阶段。5. 并发清理 (Concurrent Sweep)并发清除未被标记的垃圾对象回收内存空间。应用线程继续执行但同时会产生新的垃圾称为“浮动垃圾”。6. 并发重置 (Concurrent Reset)并发重置 CMS 内部数据结构为下一次回收做准备。注意并发 ≠ 并行。并行多条 GC 线程同时工作但应用线程完全暂停。并发GC 线程与应用线程交替执行应用不中断。3. 内存碎片问题与解决CMS 基于“标记-清除”算法而非“标记-整理”或“复制”算法。这意味着它在回收后不会移动存活对象导致老年代出现大量不连续的内存碎片。下图示意了回收前后老年代空间的变化碎片带来的问题即使总剩余内存足够也可能因为找不到连续空间而无法分配一个大对象从而提前触发 Full GC。解决方案参数-XX:UseCMSCompactAtFullCollection在 CMS Full GC 后进行一次内存压缩整理整理过程 STW。-XX:CMSFullGCsBeforeCompactionn设定在 n 次 CMS 回收后强制执行一次压缩整理。4. 关键参数详解与调优建议CMS 提供了丰富的参数帮助我们根据应用特点精细调优。参数含义调优建议-XX:UseConcMarkSweepGC启用 CMS 回收器基本开关开启后老年代使用 CMS新生代默认用 ParNew。-XX:ConcGCThreads或-XX:ParallelCMSThreads设置并发线程数默认 (ParallelGCThreads 3) / 4。CPU 核心数较少时不宜设置过大否则会抢占应用 CPU。-XX:CMSInitiatingOccupancyFraction老年代使用率达到多少时触发 CMS 回收默认 68%。内存增长快可降低如 60%增长慢可提高如 80%减少 GC 频率。-XX:UseCMSCompactAtFullCollection是否在 Full GC 后整理内存建议开启以缓解碎片问题但会增加停顿时间。-XX:CMSFullGCsBeforeCompaction多少次 CMS 后执行一次压缩默认 0即每次 Full GC 后都压缩。可适当调大如 5平衡碎片与停顿。⚠️ 注意事项如果 CMS 回收期间内存使用率继续增长导致可用空间不足CMS 会回收失败此时 JVM 会退化为串行 Full GC单线程STW停顿时间会极长。因此合理设置CMSInitiatingOccupancyFraction至关重要要保证在 CMS 完成前应用有足够内存可用。5. 实战日志解读我们使用以下参数运行一段产生 OOM 的代码-Xms10m -Xmx10m -XX:PrintGCDetails -XX:UseConcMarkSweepGC截取关键日志片段并逐行解析已配合你提供的日志[GC (Allocation Failure) [ParNew: 1428K-34K(3072K), 0.0016320 secs] [CMS (concurrent mode failure): 5709K-2754K(6848K), 0.0042625 secs] 5745K-2754K(9920K)]ParNew新生代 GC回收后 1428K → 34K。concurrent mode failureCMS 并发回收时老年代又满了导致 CMS 失败触发 Full GC。随后出现[Full GC (Allocation Failure) [CMS: ...]表明老年代串行回收启动。[GC (CMS Initial Mark) [CMS Initial Mark: 4816K(6848K)] 4816K(9920K), 0.0004828 secs]初始标记STW 0.48ms标记根对象速度很快。[CMS-concurrent-mark-start] java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(...)并发标记开始但此时应用因堆内存耗尽抛出 OOM。说明CMSInitiatingOccupancyFraction触发阈值过高导致还没完成回收内存就满了。[CMS-concurrent-preclean: 0.000/0.000 secs] [GC (CMS Final Remark) [YG occupancy: 81 K (3072 K)] [Rescan (parallel), 0.0002124 secs] ...]预清理和重新标记STW这里耗时极短说明存活对象不多。[CMS-concurrent-sweep-start] [CMS-concurrent-sweep: 0.000/0.000 secs] [CMS-concurrent-reset: 0.000/0.000 secs]并发清理和重置完成速度很快因为此时堆几乎已满清理量少。日志小结该案例中堆内存10MB太小且触发阈值默认68%过晚导致 CMS 还在并发标记时应用就触发了 OOM。解决方案增大堆内存或调低-XX:CMSInitiatingOccupancyFraction如 50%提前启动 CMS。6. CMS 的优缺点总结优点缺点✅低停顿大部分阶段并发GC 停顿短❌CPU 敏感并发阶段会占用应用 CPU 资源✅响应快适合交互式应用❌无法处理浮动垃圾需预留空间可能触发 concurrent mode failure✅ 可配合 ParNew 新生代并行回收❌内存碎片需额外压缩增加 STW❌ 实现复杂JDK9 后已被标记为废弃G1 替代

相关新闻

VisualCppRedist AIO:终极解决方案,一键修复Windows软件运行库问题

VisualCppRedist AIO:终极解决方案,一键修复Windows软件运行库问题

VisualCppRedist AIO:终极解决方案,一键修复Windows软件运行库问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否经常遇到Window…

2026/7/27 18:20:37阅读更多 →
Stellaris ADC序列采样与硬件平均技术:嵌入式数据采集高效实践

Stellaris ADC序列采样与硬件平均技术:嵌入式数据采集高效实践

1. 项目概述与核心价值在嵌入式系统开发中,模数转换器(ADC)扮演着连接物理世界与数字世界的“翻译官”角色。无论是读取温度传感器的微弱电压,还是监测电池的剩余电量,都需要ADC将连续的模拟信号转换为微控制器能够处理…

2026/7/27 18:20:37阅读更多 →
26年AI大模型学习路线顺序,终于搞懂了!

26年AI大模型学习路线顺序,终于搞懂了!

学习AI大模型是一个系统性的工程,不需要一上来就死磕复杂的数学公式和底层源码。根据目前主流的学习经验,建议按照“基础打底 → 核心原理 → 应用实战 → 工程进阶”的路径循序渐进。 阶段一:基础打底(编程与数学)编程…

2026/7/27 18:18:37阅读更多 →
如何用pkNX终极工具打造个性化宝可梦Switch游戏体验

如何用pkNX终极工具打造个性化宝可梦Switch游戏体验

如何用pkNX终极工具打造个性化宝可梦Switch游戏体验 【免费下载链接】pkNX Pokmon (Nintendo Switch) ROM Editor & Randomizer 项目地址: https://gitcode.com/gh_mirrors/pk/pkNX 你是否曾经想过自定义宝可梦游戏,打造完全属于自己的冒险世界&#xff…

2026/7/27 19:34:44阅读更多 →
2026年CPQ软件推荐有实力品牌综合评测指南

2026年CPQ软件推荐有实力品牌综合评测指南

2026年CPQ软件选型核心速览本次评测聚焦品牌实力、落地能力、场景适配三大维度,覆盖国内主流CPQ软件品牌及国际头部产品,为制造业企业选型提供客观参考国产CPQ软件在本土化服务、复杂场景适配、投入产出比方面优势显著,逐步成为制造业数字化转…

2026/7/27 19:34:44阅读更多 →
从Tailwind到Bootstrap:Jetstrap让Laravel界面开发提速50%

从Tailwind到Bootstrap:Jetstrap让Laravel界面开发提速50%

从Tailwind到Bootstrap:Jetstrap让Laravel界面开发提速50% 【免费下载链接】jetstrap A Laravel 8 package to easily switch TailwindCSS resources generated by Laravel Jetstream and Breeze to Bootstrap 4. 项目地址: https://gitcode.com/gh_mirrors/je/je…

2026/7/27 19:34:44阅读更多 →
Redis-Search性能优化技巧:让你的Rails应用搜索速度提升10倍

Redis-Search性能优化技巧:让你的Rails应用搜索速度提升10倍

Redis-Search性能优化技巧:让你的Rails应用搜索速度提升10倍 【免费下载链接】redis-search Deprecated! High performance real-time prefix search, indexes store in Redis for Rails application 项目地址: https://gitcode.com/gh_mirrors/re/redis-search …

2026/7/27 19:34:44阅读更多 →
docker 安装mysql完美教程 建议收藏

docker 安装mysql完美教程 建议收藏

一、安装mysql5.7 直接复制粘贴跟着做即可快速完成,可以不用查看详细步骤 (1)拉取 docker pull mysql:5.7 #或者 docker pull swr.cn-north-4.myhuaweicloud.com/library/mysql:5.7 (2)在本地创建mysql的映射目录 mk…

2026/7/27 19:34:44阅读更多 →
Jellium Desktop系统主题分享:分享你的主题设置

Jellium Desktop系统主题分享:分享你的主题设置

Jellium Desktop系统主题分享:分享你的主题设置 【免费下载链接】jellium-desktop An unofficial desktop client for Jellyfin 项目地址: https://gitcode.com/GitHub_Trending/je/jellium-desktop Jellium Desktop是一款非官方的Jellyfin桌面客户端&#x…

2026/7/27 19:32:44阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →