垃圾回收之CMS GC

2023-11-10

 一.六个阶段

阶段 1: Initial Mark(初始标记)

这个阶段伴随着 STW 暂停。初始标记的目标是标记所有的 根对象,包括根对象直接引用的对象,以及被年轻代中所 有存活对象所引用的对象(老年代单独回收)。

阶段 2: Concurrent Mark(并发标记)

在此阶段,CMS GC 遍历老年代,标记所有的存活对象,从 前一阶段 “Initial Mark” 找到的根对象开始算起。 “并发标 记”阶段,就是与应用程序同时运行,不用暂停的阶段。

阶段 3: Concurrent Preclean(并发预清理)

此阶段同样是与应用线程并发执行的,不需要停止应用线 程。 因为前一阶段【并发标记】与程序并发运行,可能 有一些引用关系已经发生了改变。如果在并发标记过程中 引用关系发生了变化,JVM 会通过“Card(卡片)”的方 式将发生了改变的区域标记为“脏”区,这就是所谓的 卡片 标记(Card Marking)。 

阶段 4: Final Remark(最终标记)

最终标记阶段是此次 GC 事件中的第二次(也是最后一次)STW 停顿。本阶段的目标是完成老年代中所有存活对象的标记。因为 之前的预清理阶段是并发执行的,有可能 GC 线程跟不上应用程 序的修改速度。所以需要一次 STW 暂停来处理各种复杂的情况。 通常 CMS 会尝试在年轻代尽可能空的情况下执行 Final Remark 阶段,以免连续触发多次 STW 事件。

阶段 5: Concurrent Sweep(并发清除)

此阶段与应用程序并发执行,不需要 STW 停顿。JVM 在此 阶段删除不再使用的对象,并回收他们占用的内存空间。

阶段 6: Concurrent Reset(并发重置)

此阶段与应用程序并发执行,重置 CMS 算法相关的内部 数据,为下一次 GC 循环做准备

二.CMS优缺点

CMS 垃圾收集器在减少停顿时间上做了很多复杂而有用的 工作,用于垃圾回收的并发线程执行的同时,并不需要暂停 应用线程。 当然,CMS 也有一些缺点,其中最大的问题就 是老年代内存碎片问题(因为不压缩),在某些情况下 GC 会造成不可预测的暂停时间,特别是堆内存较大的情况下。

三.特点

其对年轻代采用并行 STW 方式的 mark-copy (标记-复制)算法,对老年代主要使用并发 mark-sweep ( 标记-清除)算法。

CMS GC 的设计目标是避免在老年代垃圾收集时出现长时间的卡顿,主要通过两种手段来达成此目标:

1)不对老年代进行整理,而是使用空闲列表(free-lists)来管理内存空间的回收。

2) 在 mark-and-sweep (标记-清除) 阶段的大部分工作和应用线程一起并发执行。

也就是说,在这些阶段并没有明显的应用线程暂停。但值得注意的是,它仍然和应用线程争抢CPU 时。 默认情况下,CMS 使用的并发线程数等于 CPU 核心数的 1/4。 如果服务器是多核 CPU,并且主要调优目标是降低 GC 停顿导致的系统延迟,那么使用 CMS 是个很明智 的选择。进行老年代的并发回收时,可能会伴随着多次年轻代的 minor GC

四.参数配置

java -Xmx1g -Xms1g -XX:-UseAdaptiveSizePolicy -XX:-UseConcMarkSweepGC -jar gateway-server-0.0.1-SNAPSHOT.jar
五.并行 Parallel 与并发 Concurrent 的区别?

两者都是多线程运行,不同的是,并行Parallel在GC期间所有的CPU内核都用来做垃圾回收,暂停了业务线程;而并发 Concurrent在GC期间大部分时候和应用线程一起执行,不影响业务线程的连续执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

垃圾回收之CMS GC 的相关文章

随机推荐

  • 波形发生器 -- 输出正弦波,三角波,矩形波,锯齿波,梯形波 -- DAC0832

    波形发生器 输出正弦波 三角波 矩形波 锯齿波 梯形波 DAC0832 使用MSC 51单片机系统和相关电子器件 如 D A A D转换器 数码管或液晶显示器 运算放大器 示波器等 设计电路使其能产生正弦波 三角波 矩形波 锯齿波 梯形波
  • 如何让Windos系统定时休眠

    让Windows 10 计算机在1小时后只进行一次性的休眠 可以使用命令行或者批处理脚本来实现 以下是通过命令行来设置计算机在1小时后进行一次性的休眠的步骤 打开命令提示符 按下 Win R 键 输入 cmd 然后按下 Enter 键 这将
  • 利用多线程和 C++ 实现一个简单的 HTTP 服务器

    前言 服务器是现代软件不可或缺的一部分 而服务器的技术也是非常复杂和有趣的方向 随着操作系统不断地发展 服务器的底层架构也在不断变化 本文介绍一种使用 C 和 多线程实现的简单 HTTP 服务器 首先我们先来看一下如何创建一个服务器 int
  • IOCP机制与网络代理服务器实现方法

    请求问题 采用IOCP多线程控制模型建立高效网络代理服务器思想 能够较好地代理服务器中的多线程竞争问题 本文在比较基于该模型的两种编程方案的基础上 给出了基于Windows2000的网络代理服务器的设计与代理实现过程 关键词 完成端口重叠I
  • javadoc是什么

    Javadoc是什么 官方回答 Javadoc is a tool for generating API documentation in HTML format from doc comments in source code 译 Jav
  • 超简单! Flutter便捷添加资源图片,自动生成2x,x

    超简单 Flutter便捷添加资源图片 自动生成2x x https juejin im post 5e959da6e51d4546c349e52f 简书 https www jianshu com p 6df4663a7a14 注意 该插
  • C++11多线程:condition_variable头文件

  • VSCODE 使用插件 Doxygen Documentation Generator

    VSCODE 使用插件 Doxygen Documentation Generator 文章目录 VSCODE 使用插件 Doxygen Documentation Generator 1 安装插件 Doxygen Documentatio
  • QT5.14.2 Windows10下安装和配置

    QT5 14 2 Windows10下安装和配置 Qt下载 Qt安装 Qt创建一个项目 Qt下载 Qt的最新版本已更新 Qt6 5版本 但已改为登录Qt账号并在线安装 在线安装替换源 清华大学开源软件镜像站 本片选用最后的可离线安装的 ex
  • [论文阅读] (04) 人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术

    外滩大会 AI安全 智能时代的攻守道 Deep Learning Security From the NLP Perspective 浙江大学 秀璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者
  • Labelme安装及使用教程

    Labelme安装教程 基于anaconda 1 创建anaconda虚拟环境labelme conda create n labelme python 3 6 完成之后如图所示 由于我已经创建了labelme故这里用labelme1代替
  • 产品思维用户思维

    用户思维是一种关注用户需求 体验和价值的思维方式 将用户放在产品设计 开发和提供服务的核心位置 它强调了理解用户在不同场景下的需求 提供与之相匹配的解决方案 从而帮助用户实现他们的目标 描述一个用户时 可以从不同角度来考虑 按人口属性描述用
  • 什么是搜索引擎?

    搜索引擎 搜索引擎是指根据一定的策略 运用特定的计算机程序从互联网上搜集信息 在对信息进行组织和处理后 为用户提供检索服务 将用户检索相关的信息展示给用户的系统 搜索引擎包括全文索引 目录索引 元搜索引擎 垂直搜索引擎 集合式搜索引擎 门户
  • 排序算法-选择排序

    属性 基本思想 每一次从待排序的数据元素中选出最小 或最大 的一个元素 存放在序列的起始位置 直到全部待排序的数据元素排完 过程 在元素集合array i array n 1 中选择关键码最大 小 的数据元素 若它不是这组元素中的最后一个
  • 刷脸支付完全融入了我们的日常生活

    现金支付的假币 丢失等问题层出不穷 随着现金交易出现的不便 银行卡的出现成为人们支付方式的一大转变 智能手机的发展和网络科技的进步催生了网络支付方式 AI智能技术的不断发展又让人们迎来了一场刷脸支付的新革命 刷脸支付是指用户在购物后的支付认
  • rabbitmq 连接报错 An unexpected connection driver error occured(亲测)

    在服务器上安装了一个RabbitMq 并新创建了一个用户授予了管理员角色 登录控制台查看一切正常 兴高采烈启动项目进行连接 结果一盆冷水下来 报如下错误 o s a r l SimpleMessageListenerContainer Fa
  • git中format-patch和chery-pick的区别和联系

    chery pick 把其他分支的一次或多次commit 在当前分支上重演 典型的使用场景 其他分支有很多提交 但是你只对其中的一部分感兴趣 这时候可以使用chery pick 只挑选其他分支感兴趣的commit 合并到自己的分支中 for
  • mybatis if-else(写法)

  • Debian GNU/Linux 中以源码方式安装Odoo 14(社区版)

    Odoo是一种流行的开源商务应用程序套件 可帮助公司管理和运营其业务 也可用于在线教学 它包括广泛的应用程序 Debian GNU Linux 是社区版服务器的代表 本文将介绍如何在Debian GNU Linux中以源码方式安装和部署Od
  • 垃圾回收之CMS GC

    一 六个阶段 阶段 1 Initial Mark 初始标记 这个阶段伴随着 STW 暂停 初始标记的目标是标记所有的 根对象 包括根对象直接引用的对象 以及被年轻代中所 有存活对象所引用的对象 老年代单独回收 阶段 2 Concurrent