JVM 面试必问的 CMS,你懂了吗?

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

前言

虽然 CMS 已经是很古老的垃圾回收器了,大家现在动不动就G1、ZGC啥的,但是据我所了解,还是有很多公司的生产环境主要使用的 CMS,包括我自己呆过的几家大厂也是。

因此在 JVM 面试中,CMS 也是问的最多的,包括我自己现在面试别人时,问到 JVM 这一块,我也喜欢从CMS开始,逐渐深入。

不多废话,今天我们就来盘他。

正文

1、什么是卡表(card table)?

试想一下,在进行 YGC 时,如何判断是否存在老年代到新生代的引用?

一个简单的办法是扫描整个老年代,但是这个代价太大了,因此 JVM 引入了卡表来解决这个问题。

卡表又称为卡片标记(card marking),由 Paul R. Wilson 和 Thomas G. Moher 在1989年发表的论文里提出。

其原理为,在逻辑上将老年代空间分割为若干个固定大小的连续区域,分割出来的每一个个区域就称为卡片(card)。另外,为每个卡片准备一个与其对应的标记位,最简单的实现方案是由字节数组实现,以卡的编号作为索引。每个卡的大小通常介于128~512字节之间,一般使用2的幂字节大小,例如HotSpot使用512字节。

当卡片内部发生引用变化时(指针写操作),写屏障会将该卡在卡表中对应的字节标记为脏(dirty)。

有了卡表后,在 YGC 时,只需将卡表中被标记为 dirty 的 card 也作为扫描范围,就可以保障不扫描整个老年代也不会有遗漏了。
 

2、什么是 mod-union table?

通过上面对 card table 的介绍,我们知道 card table 会记录下老年代所有发生过引用变化对象所在的 card,而 CMS 在并发标记等阶段,也需要记录下老年代发生引用变化的对象以便后续重新扫描,是否可以直接复用 card table?

答案是不行的,这是因为每次 YGC 过程中都涉及重置和重新扫描 card table,这样是满足了 YGC 的需求,但却破坏了CMS的需求,CMS 需要的信息可能被 YGC 给重置掉了。为了避免丢失信息,于是在 card table 之外另外加了一个 Bitmap 叫做 mod-union table。

在 CMS 并发标记正在运行的过程中,每当发生一次 YGC,当 YGC 要重置 card table 里的某个记录时,就会更新 mod-union table 对应的 bit,相当于将 card table 里的信息转移到了 mod-union table 里。

这样,最后到 Final remark 的时候,card table 加 mod-union table 就足以记录在并发标记过程中老年代发生的所有引用变化了。

3、CMS 垃圾收集的过程?

CMS 垃圾收集的过程网上通常有两个版本,4个步骤的和7个步骤的,两个版本其实都是对的。

4个步骤应该主要是跟随周志明的说法,而 CMS 的相关论文其实也是按4个步骤介绍。

7个步骤则应该更多是从 CMS 的日志得出的说法,而7个步骤里其实也包含了上述的4个步骤,可以理解为7个步骤是更细的说法。

个人而言,我会更喜欢7个步骤的说法,因此这边介绍下7个步骤

垃圾回收之CardTable和Remembered Set JVM 在进行垃圾收集的时候,有一项非常重要的工作就是确定这一次垃圾收集的对象到底有多少个,即确定 live set 的范围。卡表和 RSet(Remember Set),是 JVM 为了解决分代收集时,live set 扫描需要穿梭到不同的代的时候的效率题。对于新生代垃圾收集器而言,这个题又有其特殊之处。根据 JVM 的弱分代收集假设(weak generational hypothesis)的存在,每次垃圾收集的时候,新生代的扫描范围可能很大,但新生代的 live set 不应该太大。 阅读详情

相关推荐

如何应对面试官的JVM调优

为什么要进行JVM调优 我猜你肯定是为了面试,现在很多公司都会这个,虽然你工作了N年JVM调优可能都不会接触到,但我觉得还是有考察的要的。因为很多时候我们考察一个人不光要考察他的硬实力,还要看他有没有持续学习、深入研究的精神,一只咸鱼是不会看JVM调优的。 JVM调优真的有用吗?能解决什么题? 用肯定是有用的。但是,默认的大部分情况是足够你用的,出了题应该先从程序找题,不要让JVM背锅好吗? 如何应对面试JVM调优的题 我觉得应该很少有面试官会上来就JVM调优怎么调,毕竟这显得有点奇怪

诺浅的专栏 8715

JVM-垃圾收集器之CMS

​ 自 Sun 发布 Java 语言以来,开始使用GC 技术来进行内存自动管理,避免了手动管理带来的悬挂指针(Dangling Pointer)题,很大程度上提升了开发效率。​ 但GC 题处理能力能不能系统性掌握?一些影响因素都是互为因果的题该怎么分析?比如一个服务 RT 突然上涨,有GC 耗时增大、线程 Block 增多、慢查询增多、CPU 负载高四个表象,到底哪个是诱因?如何判断 GC 有没有题?使用 CMS 有哪些常见题?如何判断根因是什么?

qq_36010886的博客 1373

深入理解jvm-CMS垃圾回收器

本文参考圣思园张龙深入理解jvm CMS收集器 CMS收集器:https://www.cnblogs.com/webor2006/p/11055468.html 介绍和优缺点 Concurrent 并发:垃圾收集的线程可以跟用户的执行线程同时执行,也非绝对。 而标记哪些对象是存活的,哪些对象是可以回收的。 CMS,以获取最短的回收停顿时间为目标,是一款基于“标记—清除”算法实现的...

zz133110的博客 1264

JVM 面试CMS,你了吗?,Java大厂面试真题解析大全

CMS 并发标记正在运行的过程中,每当发生一次 YGC,当 YGC 要重置 card table 里的某个记录时,就会更新 mod-union table 对应的 bit,相当于将 card table 里的信息转移到了 mod-union table 里。在三色标记法中(见下面介绍),如果扫描到被标记为黑色的对象就会终止,而之前的并发标记和预处理已经完成了绝大部分对象的标记,也就是此时大部分对象已经是黑色了,因此 Final Remark 阶段的工作其实会减少很多。白色:还未搜索过的对象。

qd520_1314的博客 713

面渣逆袭:JVM经典五十,这下面试稳了

打算年后跳槽的,建议看看!不跳槽也可以先收藏。 五十、六十一图、两万字,彻底搞定JVM!

三分恶的博客 2万+

2020年JVM面试题吐血整理【面试看】

2B哥今天给大家带来点jvm相关的面试题,希望小伙伴们可以在春节这段时间好好复习下。看完这篇JVM面试基本没题。95%内容都在在,更多的面试题可以关注公众号(微信搜:java2b) 1、内存模型以及分区,需要详细到每个区放什么。 JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(static 常量和 static 变量)等放在方法区 new...

程序员Monkey的专栏 1万+

2022年最新面试JVM面试追魂夺命17,教科书级回答

文章目录前言1.JVM的运行时数据区有哪些?2.什么是堆内存?堆内存包含哪些部分?3.什么是内存溢出?4.什么是内存泄漏?与内存溢出有什么关系?与内存溢出的关系!5.你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。CMS收集器和G1收集器的区别6.常用的JVM启动参数有哪些?7.设置堆空间的最大值(-Xmx)应该要考虑哪些因素?8.什么是STW?什么是安全点,什么是安全区域?安全点安全区域9.如果CPU使用率突然飙升,你会怎么排查?10.判断一个对象应该被回收11.回收方

一名很普通的互联网打工人 1万+

面试阿里我竟然倒在这一JVM面试题下

面试阿里我竟然倒在这一JVM面试题下 前言: 面试阿里倒在了JVM垃圾回收机制,何时触发MinorGC等操作这道面试题下,回去重新刷了一遍常JVM面试题,特意整理出22道分享给大家。八月已经来临了,离跳槽高峰金九银十还远嘛,是时候为了跳槽为了高薪奋斗了,后续也会更新更多各方面的面试题,大家记得关注我哦,由于篇幅的限制本文只有前十个在文章中带答案,之后的需要答案的可以关注我的...

Javazhoumou的博客 8361

20道阿里面试JVM面试专题(文末附送答案及JVM学习文档)

前言 很多朋友对面试不够了解,不知道如何准备,对面试环节的设置以及目的不够了解,因此成功率不高。通常情况下校招生面试的成功率低于1%,而社招的面试成功率也低于5%,所以对于候选人一定要知道设立面试的初衷以及每个环节的意义,有的放矢…… 而JVMJava 程序运行基础,面试时一定会遇到 JVM 相关的题。所以我们准备了部分的面试真题,作为参考,看看你距离阿里还差多远。 1. 内存模型以及分区,需要详细到每个区放什么。 2. 堆里面的分区:Eden,survival (f.

python6_quanzhan的博客 1372

阿里面试JVM

对于Java程序员来说,在众多Java知识点当中JVM是很重要的一块,在Java程序员面试的时候往往也会考察这方面的知识。比如新浪、阿里、腾讯、百度、美团、小米等大厂在面...

JAVA高级架构 299

24道几乎JVM面试题你能答出几道?

前言 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键,所以在面试Java岗的时候JVM几乎是的,所以今天我总结了24道JVM相对来说有代表性的面试题,希望对你有所帮助。 之前发过其他关于面试题的文章,然后有粉丝留言建议不要一开始就直接把答案贴出来,所以这篇文章我就先把题目放出来,答不出来的题可以翻一下放在后面的答案。 那话不多说,我们开始正题。 JVM 底层面试题 说一下JVM的主要组成部分?及其作用? 说一下JVM运行时数据区? 队列和栈是什么?有什么

1121

面试JVM垃圾收集机制详解

作为一名有八年经验的Java后端开发工程师,我深知垃圾回收(GC)机制在日常开发中的重要性。GC不仅是Java自动内存管理的核心,更是**系统稳定性和性能调优的关键

Minoz_wl的博客 688
上一篇: 不是水文 ,没有人这样教过 Spring Security 和 OAuth 2.0
下一篇: Go:如何实现领域驱动设计(DDD)
Java领域指导者
博客等级 码龄6年 404粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值