分享好友 最新动态首页 最新动态分类 切换频道
CMS垃圾回收器详解
2024-12-27 05:46

首先介绍几个概念

  • Minor GC:发生在年轻代的 GC。
  • Major GC:发生在老年代的 GC。
  • Full GC:全堆垃圾回收。比如 Metaspace 区引起年轻代和老年代的回收。

CMS 的全称是 Mostly Concurrent Mark and Sweep Garbage Collector(主要并发­标记­清除­垃圾收集器,它在年轻代使用复制算法,而对老年代使用标记-清除算法。你可以看到,在老年代阶段,比起 Mark-Sweep,它多了一个并发字样。

CMS 的设计目标,是避免在老年代 GC 时出现长时间的卡顿(但它并不是一个老年代回收器)。如果你不希望有长时间的停顿,同时你的 CPU 资源也比较丰富,使用 CMS 是比较合适的。

CMS 使用的是 Sweep(清除) 而不是 Compact(复制,所以它的主要问题是碎片化。随着 JVM 的长时间运行碎片化会越来越严重,只有通过 Full GC 才能完成整理。

 

1.初始标记(Initial Mark

初始标记阶段,只标记直接关联 GC root 的对象,不用向下追溯。因为最耗时的就在 tracing 阶段,这样就极大地缩短了初始标记时间。

这个过程是 STW 的,但由于只是标记第一层,所以速度是很快的。

注意,这里除了要标记相关的 GC Roots 之外,还要标记年轻代中对象的引用,这也是 CMS 老年代回收,依然要扫描新生代的原因。

 

2.并发标记(Concurrent Mark

在初始标记的基础上,进行并发标记。这一步骤主要是 tracinng 的过程,用于标记所有可达的对象。

这个过程会持续比较长的时间,但却可以和用户线程并行。在这个阶段的执行过程中,可能会产生很多变化

  • 有些对象,从新生代晋升到了老年代

  • 有些对象,直接分配到了老年代

  • 老年代或者新生代的对象引用发生了变化。

上节中提到过的的卡片标记,在这个阶段受到影响的老年代对象所对应的卡页,会被标记为 dirty,用于后续重新标记阶段的扫描。

并发预清理(Concurrent Preclean

本阶段也是不会 STW,目的是为了让重新标记阶段的 STW 尽可能短。这时候老年代中被标记为 dirty 的卡页中的对象,就会被重新标记,然后清除掉 dirty 的状态。

由于这个阶段也是可以并发的,在执行过程中引用关系依然会发生一些变化。我们可以假定这个清理动作是第一次清理。

所以重新标记阶段,有可能还会有处于 dirty 状态的卡页。

并发可取消的预清理(Concurrent Abortable Preclean

因为重新标记是需要 STW 的,所以会有很多次预清理动作。并发可取消的预清理,顾名思义,在满足某些条件的时候,可以终止,比如迭代次数、有用工作量、消耗的系统时间等。

这个阶段是可选的。换句话说,这个阶段是“并发预清理”阶段的一种优化。

这个阶段的第一个意图,是避免回扫年轻代的大量对象;另外一个意图,就是当满足最终标记的条件时,自动退出。

我们在前面说过,标记动作是需要扫描年轻代的。如果年轻代的对象太多,肯定会严重影响标记的时间。如果在此之前能够进行一次 Minor GC,情况会不会变得好了许多

CMS 提供了参数 CMSScavengeBeforeRemark,可以在进入重新标记之前强制进行一次 Minor GC。

但请你记住一件事情,GC 的停顿是不分什么年轻代老年代的。设置了上面的参数,可能会在一个比较长的 Minor GC 之后,紧跟着一个 CMS 的 Remark,它们都是 STW 的。

这部分有非常多的配置参数。但是一般都不会去改动。

 

3.最终标记(Final Remark

通常 CMS 会尝试在年轻代尽可能空的情况下运行 Final Remark 阶段,以免接连多次发生 STW 事件。

这是 CMS 垃圾回收阶段的第二次 STW 阶段,目标是完成老年代中所有存活对象的标记。我们前面多轮的 preclean 阶段,一直在和应用线程玩追赶游戏,有可能跟不上引用的变化速度。本轮的标记动作就需要 STW 来处理这些情况。

如果预处理阶段做的不够好,会显著增加本阶段的 STW 时间。你可以看到,CMS 垃圾回收器把回收过程分了多个部分,而影响最大的不是 STW 阶段本身,而是它之前的预处理动作。

 

4.并发清除(Concurrent Sweep

此阶段用户线程被重新激活,目标是删掉不可达的对象,并回收它们的空间。

由于 CMS 并发清理阶段用户线程还在运行中,伴随程序运行自然就还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS 无法在当次 GC 中处理掉它们,只好留待下一次 GC 时再清理掉。这一部分垃圾就称为“浮动垃圾”。

并发重置(Concurrent Reset

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

内存碎片

由于 CMS 在执行过程中,用户线程还需要运行,那就需要保证有充足的内存空间供用户使用。如果等到老年代空间快满了,再开启这个回收过程,用户线程可能会产生“Concurrent Mode Failure”的错误,这时会临时启用 Serial Old 收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了(STW)。

这部分空间预留,一般在 30% 左右即可,那么能用的大概只有 70%。参数 -XX:CMSInitiatingOccupancyFraction 用来配置这个比例(记得要首先开启参数UseCMSInitiatingOccupancyOnly)。也就是说,当老年代的使用率达到 70%,就会触发 GC 了。如果你的系统老年代增长不是太快,可以调高这个参数,降低内存回收的次数。

其实,这个比率非常不好设置。一般在堆大小小于 2GB 的时候,都不会考虑 CMS 垃圾回收器。

另外,CMS 对老年代回收的时候,并没有内存的整理阶段。这就造成程序在长时间运行之后,碎片太多。如果你申请一个稍大的对象,就会引起分配失败。

CMS 提供了两个参数来解决这个问题

(1) UseCMSCompactAtFullCollection(默认开启,表示在要进行 Full GC 的时候,进行内存碎片整理。内存整理的过程是无法并发的,所以停顿时间会变长。

(2)CMSFullGCsBeforeCompaction,每隔多少次不压缩的 Full GC 后,执行一次带压缩的 Full GC。默认值为 0,表示每次进入 Full GC 时都进行碎片整理。

所以,预留空间加上内存的碎片,使用 CMS 垃圾回收器的老年代,留给我们的空间就不是太多,这也是 CMS 的一个弱点。

一般的,我们将 CMS 垃圾回收器分为四个阶段

  1. 初始标记
  2. 并发标记
  3. 重新标记
  4. 并发清理

我们总结一下 CMS 中都会有哪些停顿(STW

  1. 初始标记,这部分的停顿时间较短
  2. Minor GC(可选,在预处理阶段对年轻代的回收,停顿由年轻代决定
  3. 重新标记,由于 preclaen 阶段的介入,这部分停顿也较短
  4. Serial-Old 收集老年代的停顿,主要发生在预留空间不足的情况下,时间会持续很长
  5. Full GC,永久代空间耗尽时的操作,由于会有整理阶段,持续时间较长。

再来看一下 CMS 的 trade-off(权衡)。

优势

低延迟,尤其对于大堆来说。大部分垃圾回收过程并发执行。

劣势

  1. 内存碎片问题。Full GC 的整理阶段,会造成较长时间的停顿。

  2. 需要预留空间,用来分配收集阶段产生的“浮动垃圾”。

  3. 使用更多的 CPU 资源,在应用运行的同时进行堆扫描。

最新文章
超逼真美女写真:AI生成工具评测全攻略!
想要使用【搜狐简单AI】来制作逼真的美女写真,也许你会问:我该从哪里开始呢?让我们来看看具体的操作步骤吧!步骤1:注册和登录 首先,你需要在搜狐简单AI的官方网站或微信小程序注册一个账户。点击注册后,按提示输入信息,完成注册后,
直播必备指南,轻松下载电脑直播间,开启直播之旅新篇章!
摘要:本指南为直播爱好者提供必备指南,轻松下载电脑直播间软件,开启直播之旅。通过简单的步骤,介绍如何选择合适的直播平台,下载直播间软件并安装,以及进行直播前的准备工作。本指南旨在帮助新手快速掌握直播技巧,顺利开启直播生涯。
零基础一站式网站建设全攻略教程
本攻略从零基础出发,提供一站式教程,助您轻松学会建设技巧。涵盖全面内容,助您快速上手,成为建设高手!前期准备事项搭建教程全面指南推荐搭建教程资源随着互联网技术的飞速进步,营销和品牌塑造日益受到企业和个人的重视,拥有一个独立
苹果 Vision Pro 预售遭黄牛用机器人抢购,可绕过脸部扫描
1 月 25 日消息,苹果 Vision Pro 头显于当地时间 1 月 19 日在美国开启预售,一份新报告显示,黄牛们用机器人程序(Bots)抢购了数千台 Vision Pro,甚至在正式开启预售前就将商品挂上 eBay,开价最高达 1 万美元(IT之家备注:当前约 716
美国《大西洋月刊》:AI“再生名人”,创意还是生意?
来源:环球时报美国《月刊》12月6日文章,原题:名人营销永不消亡——已故明星的生意站上风口 2009年,洛杉矶家事案件律师罗伯特·德克勒克跳槽成为已故演员亨弗莱·鲍嘉的遗产首席执行官。鲍嘉在上世纪50年代就已离世,但遗留的名气仍支撑
python命令大全及说明,python命令大全下载
这是本文的目录前言什么是命令行界面?你在Python开发中需要CLI吗?CLI简介WindowsMacLinux用于Python开发的20多个最有用的CLI命令安装命令1.Chocolatey2. Homebrew和Pyenv3. apt、pacman和dnf解释器命令4.python5.pip权限命令
蜘蛛池免费SEO博客,提升网站排名的秘密武器,蜘蛛池免费seo博客
蜘蛛池免费SEO博客是一种提升网站排名的秘密武器。通过创建多个博客,并相互链接,可以吸引搜索引擎的爬虫,提高网站的访问量和权重。定期发布高质量的内容,并优化关键词,可以进一步提高网站的排名。这种策略不仅有助于提升网站的流量和
移动互联通讯:AI与大数据融合塑造的未来图景
  随着科技的发展,移动互联通讯技术正在经历前所未有的变革。人工智能和大数据的融合为这一领域带来了前所未有的机遇,将对未来通讯方式产生深远影响。以下几个方面展示了人工智能与大数据在未来移动互联通讯领域的应用与趋势。  一、
马铃薯全产业链数字展示中心建设项目
温馨提示:1、投标人完成以下步骤方可投标。       (1)市场主体信息注册登记:      登录承德市公共资源交易中心网站,点击“市场主体注册”按钮,跳转至“河北省公共资源交易平台”进行注册。       (2)办理数字证书
计算机最新发展
随着科技的不断发展,计算机作为人类最重要的工具之一,也在不断地创新与发展。本文将介绍计算机在硬件、软件、人工智能、云计算、物联网和量子计算等方面的最新发展。一、硬件1. 半导体技术的进步随着半导体技术的不断突破,芯片的制造工
相关文章
推荐文章
发表评论
0评