当前位置: 首页 > news >正文

CMS(Concurrent Mark Sweep)垃圾回收器的具体流程

引言

CMS(Concurrent Mark Sweep)收集器是Java虚拟机中的一款并发收集器,其设计目标是最小化停顿时间,非常适合于对响应时间敏感的应用。与传统的串行或并行收集器不同,CMS能够尽可能地让垃圾收集线程与用户线程同时运行,从而减少应用程序的停顿时间。本文将详细介绍CMS收集器的工作流程。

CMS收集器的基本概念

CMS收集器采用“标记-清除”算法,在整个GC过程中尽量保持与用户线程的并发执行。它由多个阶段组成,每个阶段都有特定的任务,并且根据是否需要暂停用户线程分为两类:需要短暂暂停的阶段和完全并发的阶段。

CMS收集器的工作流程

CMS收集器的操作可以分为四个主要阶段,以及一个额外的重置阶段:

  1. 初始标记 (Initial Mark)

    • 在这个阶段,所有其他线程都会被暂停(“Stop The World”, STW),以便准确记录下直接从GC Roots可达的对象。
    • 这个过程非常快,因为它只需要扫描根节点(如栈帧中的引用、静态变量等),而不需要遍历整个对象图。
  2. 并发标记 (Concurrent Mark)

    • 此时,用户线程恢复运行,垃圾收集器开始从GC Roots出发,沿着对象之间的引用关系递归地访问并标记所有存活的对象。
    • 由于用户线程在继续工作,可能会导致已经标记过的对象状态发生变化,因此需要额外的机制来确保正确性,比如三色标记法中的增量更新或原始快照(SATB)。
  3. 重新标记 (Remark)

    • 为了修正并发标记期间因用户程序继续运行而导致的标记变动,此阶段会再次暂停所有应用线程进行快速的重新标记。
    • 主要处理的是那些在并发标记阶段新增加的引用关系或者删除了原有引用的情况,以保证不会遗漏任何存活对象。
    • 尽管重新标记阶段也会造成短暂的STW,但它的持续时间通常比初始标记稍长一些,不过远远短于并发标记的时间。
  4. 并发清理 (Concurrent Sweep)

    • 用户线程再次恢复运行,垃圾收集器则负责清理掉所有未被标记的对象。
    • 在这个过程中,如果有新创建的对象,它们会被直接标记为黑色(即存活对象),并在当前GC周期内保留下来,这有助于避免这些新对象成为浮动垃圾。
  5. 并发重置 (Concurrent Reset)

    • 最后一步是对本次GC过程中使用的标记数据进行清理和重置,为下次GC做准备。
    • 这一阶段也是完全并发的,不影响应用程序的正常运行。
CMS收集器的特点与挑战
  • 优点

    • 低停顿时间:通过并发执行减少了对用户线程的影响,使得整体停顿时间较短。
    • 高吞吐量:当CPU资源充足时,可以有效地利用多核处理器的优势,提高GC效率。
  • 缺点

    • 对CPU资源敏感:由于需要与用户线程竞争CPU资源,可能导致性能波动。
    • 浮动垃圾问题:在并发标记和清理阶段产生的新垃圾不能立即得到处理,只能等到下一次GC。
    • 空间碎片:使用标记-清除算法容易产生内存碎片,影响后续分配大对象时的成功率。
    • 并发模式失败(Concurrent Mode Failure):如果在并发标记或清理阶段结束前又触发了新的GC,可能不得不进入全局STW状态,用Serial Old收集器来完成剩余的工作。
结语

综上所述,CMS收集器是一个针对低延迟要求而优化的选择,尤其适用于Web服务器、在线交易平台等对响应速度有严格要求的场景。尽管存在一定的局限性,但是通过合理的配置参数调整,可以在很大程度上缓解这些问题,使其更好地服务于实际应用。对于开发者而言,理解CMS收集器的工作原理不仅有助于选择合适的垃圾回收策略,还能帮助更精准地调优JVM性能。

相关文章:

CMS(Concurrent Mark Sweep)垃圾回收器的具体流程

引言 CMS(Concurrent Mark Sweep)收集器是Java虚拟机中的一款并发收集器,其设计目标是最小化停顿时间,非常适合于对响应时间敏感的应用。与传统的串行或并行收集器不同,CMS能够尽可能地让垃圾收集线程与用户线程同时运…...

【Linux】Socket编程-UDP构建自己的C++服务器

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 UDP 网络编程 🦋 接口讲解🦋 V1 版本 - echo server🦋 V2 版本 - DictServer🦋 V3 版本 - 简单聊天室 二&a…...

磁盘结构、访问时间、调度算法

目录 一、什么是磁盘? 二、磁盘分类 1、从磁头分 2、通过盘面分 三、一次磁盘读/写的时间 四、磁盘调度算法 1、先来先到服务算法FCFS 2、最短寻找时间优先SSTF 3、扫描算法(SCAN) 4、LOOk算法 5、循环扫描算法(C-SCAN…...

详解归并排序

归并排序 归并排序的基本概念归并排序的详细步骤1. 分解阶段2. 合并阶段3. 归并排序的递归流程 时间复杂度分析空间复杂度分析算法步骤2-路归并排序代码分析代码讲解1. 合并两个子数组的函数 merge()2. 归并排序函数 mergeSort()3. 打印数组的函数 printArray()4. 主函数 main(…...

45.在 Vue 3 中使用 OpenLayers 鼠标点击播放视频

引言 在 Web 开发中,地图可视化和互动功能是越来越重要的应用场景。OpenLayers 是一个强大的开源 JavaScript 库,用于显示和处理地图数据,支持多种地图服务和交互功能。在这个教程中,我们将介绍如何在 Vue 3 中集成 OpenLayers&a…...

《大话Java+playWright》系列教程初级篇-初识

后续代码会整理开源-大家期待吧!!! 首先讲下为啥不用python,因为不想下载各种安装插件,太麻烦了,好多不兼容。 所以选择了java。 先来讲下什么是playwright,playwright是微软开源自动化测试工…...

05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2)

05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2) 简介1. TLS握手过程概述2. TLS握手过程细化3. 主密钥(对称密钥)生成过程4. 密码规范变更 简介 主要讲述了混合加密流程完成后,客户端和服务器如何共同获得相同的对称密钥…...

提示词工程

一、六何分析法快速写出准确的提示词 英文单词中文解释提问时的思考示例Why何故问题的背景,包括为什么做及目标(做成什么样)最近我们要与某品牌合作推广冲牙器,对方需要我们策划一场营销活动What何事具体是什么事写一个营销策划方…...

基于python网络爬虫的搜索引擎设计

一、毕业设计(论文)题目:基于网络爬虫的搜索引擎设计 - 基于网络爬虫的搜索引擎设计1 二、毕业设计(论文)工作自 2022-09-01 起至 2022-10-28 止 三、毕业设计(论文)内容要求: 主…...

ip-协议

文章目录 1. 网络层2. ip协议2.1 ip协议格式2.2 网段划分基本概念网段划分的两种方式为什么要网段划分?特殊的IP地址IP地址数量不足 2.3 私有IP与公网IP2.4 路由 3. IP的分片与组装为什么要分片与组装?如何分片?如何组装? 1. 网络…...

Git(11)之log显示支持中文

Git(11)之log显示支持中文 Author:Once Day Date:2024年12月21日 漫漫长路有人对你微笑过嘛… 参考文档:GIT使用log命令显示中文乱码_gitlab的log在matlab里显示中文乱码-CSDN博客 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSD…...

oneflow深度学习框架使用问题总结(Windows/Linux)

目录 1.简述 2.在Windows下使用Oneflow深度学习框架(错误记录,谨慎,官方不支持,需要WSL) 2.1安装Anaconda 2.1创建虚拟环境 2.2安装Pytorch 2.3安装Pycharm 2.4 安装Oneflow 3.在Linux下使用Oneflow深度学习框…...

论文研读:AnimateDiff—通过微调SD,用图片生成动画

1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名:AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块: 视频域适应…...

SQLAlchemy示例(连接数据库插入表数据)

背景需求 连接数据库,插入表中一些数据。 其用户是新建用户,所以只能插入,不能更新。 再次输入数据则使用更新数据语法,这个没调试。 #! /usr/bin/env python # -*- coding: utf-8 -*-from sqlalchemy import create_engine, …...

Springboot3国际化

国际化实现步骤 Spring Boot 3 提供了强大的国际化支持,使得应用程序可以根据用户的语言和区域偏好适配不同的语言和地区需求。 添加国际化资源文件: 国际化资源文件通常放在 src/main/resources 目录下,并按照不同的语言和地区命名&#xf…...

阿尔萨斯(JVisualVM)JVM监控工具

文章目录 前言阿尔萨斯(JVisualVM)JVM监控工具1. 阿尔萨斯的功能2. JVisualVM启动3. 使用 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff…...

框架专题:反射

1. 什么是反射? 简单来说,反射是一种程序自省的能力,即在程序运行时动态地获取其结构信息或操作其行为。这包括类、方法、属性等元信息。反射的核心在于让代码变得更加动态化,从而突破静态语言的限制。 以Java为例,反…...

【Go】context标准库

文章目录 1. 概述1.1 什么是 Context1.2 设计原理1.3 使用场景源码分析核心:Context接口4个实现6个方法TODO 和 BackgroundWithCancelcancelpropagateCancel 绑定父对象WithTimeout 和 WithDeadlineWithValue总结参考1. 概述 基于版本: go1.22.3/src/context/context.go 1.1…...

LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读

LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 导读:2024年12月,这篇论文提出了一种名为“审慎式对齐 (Deliberative Alignment)”的新方法,旨在提高大型语言模型 (LLM) 的安全性。论…...

git设置项目远程仓库指向github的一个仓库

要将你的Git项目设置为指向GitHub上的远程仓库,你需要执行以下步骤: 创建GitHub仓库: 登录到你的GitHub账户。点击右上角的 “” 号,选择 “New repository” 创建一个新的仓库。填写仓库的名称,可以添加描述&#xff…...

Unity3D实战:从零构建竖屏飞机大战游戏

1. 竖屏游戏的基础设置 第一次打开Unity时,默认是横屏模式。我们需要做的第一件事就是把游戏改成竖屏。这个操作看似简单,但很多新手容易忽略几个关键点。在Game窗口右上角找到分辨率设置,点击加号新建一个预设。这里要特别注意选择"Asp…...

主流开源协议解析与选择指南

1. 开源协议:程序员必须掌握的法律常识第一次在GitHub上创建仓库时,面对那一长串开源协议选项,我和大多数新手一样直接懵了。MIT、Apache、GPL...这些看似简单的缩写背后,实则隐藏着影响深远的法律约束。作为从业十年的开发者&…...

APDS9999传感器驱动开发:寄存器配置、中断与FreeRTOS集成

1. Arduino_APDS9999 库深度解析:面向嵌入式工程师的环境光、色彩与接近度传感器驱动开发指南APDS9999 是 Broadcom(原 Avago)推出的高集成度光学传感器芯片,集环境光感知(ALS)、RGB 色彩识别(C…...

Naivechain性能基准测试终极指南:评估区块链吞吐量的完整教程

Naivechain性能基准测试终极指南:评估区块链吞吐量的完整教程 【免费下载链接】naivechain A blockchain implementation in 200 lines of code 项目地址: https://gitcode.com/gh_mirrors/na/naivechain 想要了解区块链的真实性能表现吗?Naivech…...

【数据结构】顺序表的应用->通讯录(详细代码及配图)

小编主页详情<-请点击 小编gitee代码仓库<-请点击 本文主要介绍了数据结构的顺序表的应用->通讯录&#xff0c;内容全由作者原创&#xff08;无AI&#xff09;&#xff0c;同时深度解析了通讯录顺序表增删查改等功能&#xff0c;并带有配图帮助博友们更好的理解&#…...

高质量高权重SEO外链平台的海量资源有哪些

高质量高权重SEO外链平台的海量资源有哪些 在当今竞争激烈的互联网市场中&#xff0c;网站的SEO优化至关重要。高质量高权重的SEO外链平台不仅能提升网站的排名&#xff0c;还能带来更多的流量和业务机会。究竟有哪些高质量高权重的SEO外链平台&#xff0c;它们的资源能为我们…...

零基础学A人工智能: 4.大模型基础与本地部署全指南

今天我们正式开启AI大模型的学习&#xff0c;从最基础的大模型概念讲起&#xff0c;到本地部署大模型的完整流程&#xff0c;再到Ollama工具的全功能详解&#xff0c;最后延伸到完整的AI聊天机器人项目架构&#xff0c;帮大家从零搭建起大模型应用的完整知识体系&#xff0c;零…...

零中频接收机设计避坑指南:从IQ信号处理到链路预算,这些细节ADS仿真时千万别忽略

零中频接收机设计避坑指南&#xff1a;从IQ信号处理到链路预算的实战精要 零中频架构在集成化浪潮中展现出独特优势——省去笨重的中频滤波器&#xff0c;直接实现射频到基带的转换。但当你真正用ADS搭建仿真模型时&#xff0c;90度移相器的相位误差可能悄悄吞噬系统EVM指标&am…...

AWS容器服务贡献者终极指南:如何成为AWS容器生态的核心参与者 [特殊字符]

AWS容器服务贡献者终极指南&#xff1a;如何成为AWS容器生态的核心参与者 &#x1f680; 【免费下载链接】containers-roadmap This is the public roadmap for AWS container services (ECS, ECR, Fargate, and EKS). 项目地址: https://gitcode.com/gh_mirrors/co/contain…...

如何构建ElasticJob监控大盘:关键指标与业务监控融合实践指南

如何构建ElasticJob监控大盘&#xff1a;关键指标与业务监控融合实践指南 【免费下载链接】shardingsphere-elasticjob Distributed scheduled job 项目地址: https://gitcode.com/gh_mirrors/shar/shardingsphere-elasticjob ElasticJob作为一款分布式调度任务框架&…...