分享好友 最新动态首页 最新动态分类 切换频道
CMS 执行的七个阶段
2024-12-27 02:15

java 优于 c++ 的一个亮点就是自动的垃圾回收机制,成也萧何败萧何,最困扰 java 程序员的问题往往又都和垃圾回收机制有关,作为一个 java 程序员,如果你不了解 java 垃圾回收的机制,那么你时刻都可能面临性能的瓶颈,甚至遇到种种诡异的问题而无从下手。

此前,我们已经介绍过 java 垃圾回收相关的很多内容:

本文我们就来详细介绍一个 java 中明星级的垃圾回收器 CMS 的回收机制,而新一代的 G1 回收器的执行机制会在下一篇文章中再来介绍,敬请期待。

CMS 是 Concurrent Mark Sweep 的缩写,是现在主流十分常用的老年代垃圾回收器,他的主要目标是用最短的回收停顿时间实现老年代的清理,因此,对于强调用户体验的互联网应用来说,CMS 成为了一个首选。

那么,CMS 垃圾回收器究竟是怎么工作的呢?

CMS 垃圾回收器采用了标记清除算法来实现。

说到“标记-清除”算法,顾名思义,jvm 将整个收集过程划分为了“标记”与“清除”两大步骤来实现。

具体到标记流程,jvm 采用了“三色标记法”,就是将不同的对象划分为三大类:

我们知道,jvm 是通过可达性分析法来实现标记过程的,jvm 从 GC Root 开始,逐步遍历引用树来实现对内存区域内每个对象的标记,可以参看:

java 对象存活判定算法

一般来说,人们通常把 CMS 的执行过程分为四个步骤:

加上可选的阶段,CMS 回收的过程可以划分为七个步骤,下面我们就来详细介绍:

如上所述,初始标记最重要的工作就是以 GC-Roots 为起点进行可达性分析,标记出所有当前活跃的也就是被引用的对象。

但是,除了被 GC-Root 引用外,老年代中的对象如果仅被年轻代中的对象引用,他也是不能回收的,因此,在上述以 GC-Roots 为起点进行的标记完成后,还需要遍历新生代对象,标记可达的老年代对象。

由于上述两个过程仅仅遍历被 GC-Roots 和新生代对象直接引用的老年代对象,执行起来速度会非常快,为了避免在标记过程中对象引用的动态变化,在初始标记阶段,程序需要进行短暂停止,这称为“Stop The World”。

jdk8 以后,初始标记支持多线程标记,可以通过 CMSParallelInitialMarkEnabled 参数开启。

“并发标记”阶段所谓的“并发”,指的就是用户线程可以与回收线程同步执行,而不需要让用户线程暂停,从而保证了用户线程的执行效率。

初始标记的过程中,为了尽量缩短用户线程的暂停时间,所以仅对被 GC-Roots 和新生代对象直接引用的老年代对象进行了标记,所以,接下来的一项工作就是对 GC-Roots 和新生代对象间接引用的老年代对象进行标记,这就是并发标记阶段的主要工作了。

4.2.1 如何处理并发标记阶段的引用关系变更

由于在并发标记阶段,用户线程与回收线程并发执行,随时可能有新生代的对象晋升到老年代、直接在老年代分配对象或者引用关系发生变更等等情况发生,这些情况下,jvm 是否必须扫描整个老年代才能够识别出这些发生了变化的对象呢?

答案当然是否定的,HotSpot 使用了一套名叫“卡表”(Card Table)的数据结构来管理老年代的内存,Card Table 实际上就是一个索引列表,每一个表项占用 1 byte 空间,索引内存中占 512 byte 的页空间。

而在对每一个对象引用进行写操作之前和之后 HotSpot 都附加了一定的逻辑,称之为“写屏障”(Write Barrier),写屏障会在一个对象的引用发生变化时,将该对象所在的页在卡表中对应的表项标记为 dirty。

但是,由于 jvm 中对象引用变更是极为频繁的,反复读写卡页显然会有很大的性能开销,于是,从 JDK7 开始,HotSpot 引入了一个新的 JVM 参数 -XX:+UseCondCardMark,从而让已经标记过的卡页不再重复标记。

这一步是可选的,可以通过参数 CMSPrecleaningEnabled 参数可以启用或关闭该阶段,默认是开启的。

上文已经介绍到,在并发标记阶段,由于引用的变更,可能会产生一些 dirty page,这一阶段的主要工作就就是处理这些脏页,虽然在后面的重新标记阶段也拥有处理脏页的逻辑,但重新标记阶段会 Stop The World,所以这一阶段的核心仍然是让停顿时间尽量缩短。

这一阶段的主要工作是处理新生代指向老年代的新引用,从而让老年代的一些未被标记的对象成为活跃对象。

同样,在重新标记阶段也会处理这样的情况,这一阶段仍然是为了缩短停顿时间而进行的。

CMS 对于该阶段有以下 4 个参数:

显然,在这一阶段中要识别新生代对象对老年代对象的新引用,那么就必须扫描整个新生代,这显然是一项很耗时的操作,但由于新生代的对象大多是朝生夕死的,所以如果在一次 minorGC 之后紧接着进行一次预清理,新生代中需要扫描的对象就会所剩无几了。

CMS 通过 CMSScavengeBeforeRemark 参数强制在可中断的并发预清理阶段执行一次 minorGC,虽然 minorGC 也会让用户线程短暂停顿,但这样可以缩短下一阶段的停顿时间,整体上还是利大于弊的。

在上述的并发过程中,用户线程始终在执行,因此随时可能会产生引用变更,比如:

这些情况下,很有可能造成标记数据的不准确,如果直接进行清理,就有可能有误清理的情况发生,因此,jvm 需要再一次 Stop The World 来进行重新标记,从而保证在真正的清理前,标记的准确性。

重新标记阶段,jvm 主要进行以下三个工作:

但由于有了前面三个步骤的反复标记过程,重新标记阶段的工作量已经被大大降低,停顿时间当然也因此大大减少。

完成了标记工作,就只剩下最后的一步工作,那就是清除了。

由于被清除的对象都是未被使用的对象,因此在清楚操作进行中,是不需要 Stop The World 的,这一步操作也是和用户线程同步执行的。

完成了整个 CMS 的标记-清除工作后,需要将 CMS 算法的内部数据进行重置,从而让下一次 GC 顺利开始。

下面是一次 CMS 进行 Full GC 的完整日志,我们可以清楚的看到每一阶段的运行信息与耗时情况:

最新文章
航海王壮志雄心克洛怎么样 航海王壮志雄心克洛详细介绍
在该游戏中,玩家可去解锁许多不同的角色,并且在技能定位以及玩法上也是十分出色,因此吸引了许多的玩家加入其中,本期小编主要是来说说航海王壮志雄心克洛,作为一个热血风格的角色,它的怒气可是能自然增长的,朋友们近期若是对于此很是
微信广告的投放逻辑,看这篇就够了!
数英用户原创文章,转载请遵守底部规范作为移动端的巨大流量入口,如何在既保证用户使用体验的同时也能带来其商业价值,一直都是腾讯,也是“微信之父”张小龙探寻的方向。众所周知,互联网的变现方式除了电商,最为普遍的就是广告流量的变
漫蛙最新最新入口在哪里?如何快速进入最新平台获取最新内容?
如果你正在寻找“漫蛙最新最新入口”,那么你来对地方了。漫蛙是一个非常受欢迎的在线平台,提供丰富的内容和服务。无论你是想了解漫蛙的最新资讯,还是需要直接访问其最新入口,这篇文章将为你提供详细的指导,帮助你快速找到正确的入口。
教你360浏览器禁用/启用地址栏复制粘贴助手图文教程
360浏览器如何禁用、启用地址栏复制粘贴助手呢?相信使用360浏览的用户在复制网站网址的时候只需使用鼠标就可以完成操作,无需使用键盘、鼠标进行操作,点击网站网址后就会出现复制网址的提示,点击即可复制。但是不少用户不喜欢这样的网址
阿里巴巴关键词源代码查看(关键词搜索代码)
本文目录一览:1、阿里巴巴国际站怎么看到别人的关键词2、数字营销阿里巴巴怎么查询有排行的关键词3、阿里巴巴诚信通会员 发布产品时的源代码编辑是什么4、阿里巴巴怎么看同行设置的关键词5、如何查看某产品关键词在阿里巴巴中文站的搜索量
超值推荐!2024年二季度南沙人气楼盘榜单,揭晓备受追捧的热门楼盘!
热度排名楼盘名地址价格1绿城·蓝湾半岛广州·南沙·深中通道旁16000元/平方米2中交·蓝色海湾港前大道南沙客运港正对面待定3越秀·珠实 | 天悦海湾南沙湾港前大道(邮轮母港南侧)24000元/平方米4保利半岛滨水大道左侧35000元/平方米5湾区
谷歌SEO优化,如何做好local business?
在当今数字化时代,谷歌搜索引擎已成为连接消费者与本地商家的重要桥梁。作为一名在SEO领域摸爬滚打多年的从业者,我深知在谷歌搜索结果中获得良好排名对于本地企业来说至关重要。这不仅意味着更多的曝光机会,还能直接转化为销售额的提升
外链建设计划:利用微信 Bug 提升网站权重
在竞争激烈的数字环境中,网站外链建设对于提高搜索引擎排名和网站可见度至关重要。利用微信 Bug 外链方法,我们可以有效地获得高质量外链,从而提升网站权重。本文将提供一个详细的外链建设规划计划和执行方案,帮助您有效地利用此策略。
除了您在Google搜索中看到的文字广告之外,展示广告网络中的网站还可以展示其他具有视觉吸引力的广告类型:文字广告 图片广告——包含照片或插图的广告富媒体广告—&m
上海天擎结合Google领先的搜索广告优化经验,为广告主定制出一套适合Google推广的解决方案MADA服务模式,通过市场分析策略、广告管理策略、数据分析策略、账户优化策略及服务保障策略全方位、专业、高效的满足企业Google推广的需求,真正
相关文章
推荐文章
发表评论
0评