《面试1v1》CMS垃圾回收期

news2025/2/22 12:25:03

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。


《面试1v1》 连载中…


面试官: 小伙子,CMS 垃圾收集器跟我讲讲?

候选人: CMS全称Concurrent Mark Sweep,是一种并发标记清除算法。它并发执行与用户程序,减少垃圾收集时程序暂停的时间。

面试官: 说白了,CMS就是为了减少卡顿吧?

候选人: 是的,CMS 的核心目标就是达到并发收集、减少停顿。它的工作流程如下:

  1. 初始标记:只标记GC Roots能直接关联的对象,速度快,与用户线程共享运行,不需要Stop The World。
// 初始标记代码示例
private void initialMark() {
    for (Object obj : strongRefs) {
        CMSCollector.mark(obj);
    }
}
  1. 并发标记:从GC Roots开始递归的标记对象图,与用户线程一起工作,需要部分STW阶段。
  2. 最终标记:修正在并发标记期间并发修改导致的错误标记,需要STW。
  3. 并发清除:与用户线程一起工作,清除被标记的对象,不需要STW。
  4. 并发重置:与用户线程一起工作,为下一次GC做准备,不需要STW。

面试官: 说说并发标记和最终标记的区别?

候选人:

  • 并发标记阶段与用户线程一起运行,在标记过程中对象图可能被修改,会产生”脏标记“。需要最终标记修正。
  • 最终标记阶段需要Stop The World,去修正并发标记期间的”脏标记“,确保正确的标记对象。
  • 如果没有最终标记阶段,并发标记的”脏标记“会导致非垃圾对象被清除,或者垃圾对象未被清除。
  • 所以,最终标记阶段是CMS算法关键,它通过STW去修正并发阶段的错误”脏标记“,使得CMS并发标记清除算法成为可能。

面试官: CMS 收集器的优缺点分别是什么?

候选人: CMS 收集器的主要优点是并发收集、低停顿,适用于对响应时间有要求的场景。
但是CMS也有一些缺点:

  1. 会产生大量空间碎片,空间利用率低。
  2. 标记和清除过程需要占用CPU资源,并发时会对程序性能产生一定影响。
  3. 并发执行时,需要处理一致性问题,会加大开发难度。
  4. 只适用于老年代回收,新生代仍需其他收集器配合。
  5. 浮动垃圾可能带来更长的GC停顿时间,不适用于需要极低停顿的场景。

所以,CMS 是一款比较经典的低停顿收集器,但也存在一定的缺陷, v在JDK9后G1成为了更好的选择。但CMS算法本身的思想仍然值得我们学习。

面试官: 说说CMS 收集器的“碎片化”问题?

候选人: CMS 是一种标记-清除算法,它会产生大量空间碎片,空间利用率低是一个缺点。这是因为:

  1. 在并发标记阶段,需与用户程序同时运行,无法移动对象。
  2. 在并发清除阶段,直接清除标记的垃圾对象,留下空隙。
  3. 这些空隙会产生空间碎片,并不连续,但空间可能不足以分配较大对象。
  4. 空间利用率降低,达不到理想状态,需要更频繁的Major GC来整理空间。
    我们可以从JVM源码中看到CMSCollector在清除对象后直接造成碎片:
//CMSCollector.java
private void sweep phase() {
    for (Object obj : markedObjects) { 
        freeMemory(obj); // 直接清除,产生碎片
    }
}

为解决这个问题,CMS做了一些努力:

  1. 采用Free-list维护小块空闲空间, satisfiy小对象分配。
  2. 对象晋升到老年代时预留一定空间减少碎片。
  3. 空间报警触发Minor GC和Full GC,做空间整合。
  4. 可配置启动Incremental CMS模式,进入并发清理阶段做连续空间整理。

但由于算法的限制,CMS仍无法完全解决碎片空间问题,这也是它被G1等收集器替代的原因之一。

面试官: 谢谢详细的解释!CMS 收集器虽然有缺陷,但它的并发标记清除思想影响了后续的垃圾回收算法。

候选人: 是的,CMS 收集器提出了并发收集和低停顿的理念,其中的并发标记清除算法也为之后G1等收集器奠定了基础。它的关键思想值得我们学习:

  1. 将清理过程分为并发和STW两个阶段,大大减少停顿。
  2. 通过最终标记修正并发阶段的”脏标记“,使得并发标记成为可能。
  3. 采用Free-list和预留空间等手段减轻空间碎片问题。
  4. 根据空间利用率与GC时间的平衡,选择满足需求的收集频率。

这些思想为我们设计低停顿、高效的GC算法提供了参考,CMS也因此成为Java垃圾收集史上的里程碑。所以,尽管它有缺陷,但它的算法思想和理念仍十分值得我们学习。

面试官: 很好,你对CMS收集器的理解已经相当透彻!希望你在日后继续深入学习其他垃圾收集算法。

候选人: 非常感谢您的夸奖和建议!我会继续努力学习和研究垃圾收集theory与实践,包括G1、ZGC、Epsilon等算法与案例。谢谢您的提问,让我有机会深入梳理CMS以及Java垃圾收集机制,收获颇丰!

面试官: 看来有点东西,你先等一下!

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!


《面试1v1》 连载中…


🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/603083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3d 有关Invoke和 Coroutine 的执行条件的误解

文章目录 认识错误的点正解测试代码执行截图 认识错误的点 之前一直以为在父物体未激活的状态下, invoke 和 Coroutine 都不会执行。这里面有一点误区。 正解 Coroutine 在父物体未激活状态下,确实不会执行。并且如果在父物体(包括祖先节点…

新手小白运行Springboot+vue项目

有时候我们会经常复刻别人的项目代码,在第一次运行别人的代码都需要哪些步骤呢? 我在第一次运行的时候踩了很多坑,也看了很多博文,这篇文章将我认为帮助较大的内容进行了一个整合,希望可以为不了解前后端分离&#xff…

【踩坑日记】【YOLO5】YOLO5 训练模型的测试结果全部相反(标签混乱)原因

问题描述 使用 labelImg 为图片数据集打上标签后交给YOLO5训练,发现测试结果中识别结果全部相反,也就是出现了标签混乱的现象。本人使用猫狗图片各 150 张作为数据集进行模型训练,训练出来的模型将所有的猫识别成了狗,所有的狗识…

【数据库从0到1】-【入门基础篇】

【数据库从0到1】-【入门基础篇】 🔻一、数据库产生背景🔻二、数据库有关概述🔻三、数据库访问接口🔻四、数据库种类🔻五、数据库有关术语🔻六、常见DBMS排名🔻七、常见数据库介绍7.1 RDS(关系型…

DVWA——Brute Force

文章目录 Brute Force(暴力(破解))(1)Low等级(2)Medium等级(3)High等级(4)Impossible Brute Force(暴力(破解&…

基于SpringBoot的三层架构开发统一响应结果

说明:三层架构开发时目前开发的主流,我这里通过一个案例,来分析非三层架构开发的不利之处,以及三层架构开发的好处。 案例说明:打开员工信息页,页面要显示所有员工的信息;前端页面已提供&#…

cs109-energy+哈佛大学能源探索项目 Part-3(探索性分析)

博主前期相关的博客见下: cs109-energy哈佛大学能源探索项目 Part-1(项目背景) cs109-energy哈佛大学能源探索项目 Part-2.1(Data Wrangling) cs109-energy哈佛大学能源探索项目 Part-2.2(Data Wrangling&a…

Java设计模式(三)

系列文章目录 迪米特法则 合成复用原则 设计原则核心思想 文章目录 系列文章目录前言一、迪米特法则1.迪米特法则基本介绍2.迪米特法则注意事项和细节 二、合成复用原则1.合成复用原则基本介绍 三、设计原则核心思想总结 前言 大家好呀,欢迎来到柚子的博客~让我们…

强化学习笔记-08 Planning and Learning

前几篇我们介绍了一个重点概念model-base和model-free,其中model-base是建立在存在某个环境模型,从模型中可以获得状态、动作、奖励的转移信息,比如动态规划方法,当我们确定了状态动作的转换概率,此时我们可以通过递归…

寄存器某个位赋值、宏定义、头文件的条件编译及全局声明extern的使用

一、给寄存器的某个位进行赋值 C语言基础知识&#xff08;位操作&#xff09; 运算符含义运算符含义&按位与~按位取反|按位或<<左移^按位异或>>右移 我们定义一个32位的寄存器变量&#xff1a;unit32_t temp0; 从左到右依次是第1位&#xff0c;第2位......第…

网络层:地址解析协议ARP

网络层&#xff1a;地址解析协议ARP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;ARP协议 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 B知道C的IP地址但如果不知道其对应的MAC地址&#xff0c;就无法将数据包发送给C&#xff0c;如何解决这个…

新款Model 3长什么样?特斯拉已经开始降价?

作者 | Amy 编辑 | 德新 马斯克时隔三年再次访华&#xff0c;期间会见了多部委领导及重量级人物&#xff0c;在北京和上海短暂停留了44小时后便离开了中国。 此前曾有多家媒体猜测马斯克可能会在中国发布/展示改款Model 3。但据彭博社报道&#xff0c;马斯克只是在上海工厂看了…

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告2

源自网络收集&#xff0c;仅供参考 实验三收集到两份完整报告&#xff0c;这是其二&#xff0c;另一份见本专栏上一篇文章。 1 实验要求 整体目的&#xff1a;理解、窗口之间的消息传送、调用栈&#xff1b;掌握光标、图标、菜单的制作和使用方 式 &#xff1b; 掌 握 菜 单…

【Vue】三:Vue核心处理---vue的其它指令和自定义指令

文章目录 1.vue的其它指令1.1v-text 和 v-html1.2 v-cloak1.3 v-once1.4 v-pre 2. 自定义指令2.1 函数式2.2 对象式2.3.定义全局的指令 1.vue的其它指令 1.1v-text 和 v-html v-text&#xff1a;当做文件解析。 v-html&#xff1a;当做 HTML 代码解析。 1.2 v-cloak v-cloa…

在自定义数据集上训练 YOLOv8——完整教程

Ultralytics 最近发布了 YOLOv8 系列对象检测模型。这些模型在 COCO 数据集上的速度和准确性都优于之前版本的 YOLO 模型。但是自定义数据集的性能如何呢?为了回答这个问题,我们将在自定义数据集上训练 YOLOv8 模型。具体来说,我们将在大规模坑洞检测数据集上对其进行训练。…

电子模块|压力传感器模块HX711---C51STM32驱动

电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动 实物照片模块简介模块特点 软件驱动C51软件代码STM32软件代码 实物照片 模块简介 HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比&#xff0c;该芯片集成了包括稳压电源、…

Rust 标准库字符串类型String及其46种常用方法

Rust字符串 Rust主要有两种类型的字符串&#xff1a;&str和String &str 由&[u8]表示&#xff0c;UTF-8编码的字符串的引用&#xff0c;字符串字面值&#xff0c;也称作字符串切片。&#xff06;str用于查看字符串中的数据。它的大小是固定的&#xff0c;即它不能…

网络层:IP地址

网络层&#xff1a;IP地址 笔记来源&#xff1a; 湖科大教书匠&#xff1a;IP地址 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 IP地址是因特网(Internet)上的主机和路由器所使用的地址&#xff0c;用于标识两部分信息&#xff1a; 网络编号&am…

Allegro16.6详细教程(一)

第一章User Interface 本章的主要內容介紹allegro操作介面,透過本章學習可以對Allegro的工作介面有了大致的瞭解,同時也能體驗出Allegro PCB Layout時的強大功能。 A.程式的啟動 除了以上Allegro主程式,我們還會常用到以下幾個常用工具: • Padstack Designer (Padstack…

《代码日记》

代码日记 Project :Space1、new_method.py new2.pynew3.pynew4.pynew5.py new5.1.pynew6.py Project :Space 都是在D001289数据集上的测试 1、new_method.py 先划分训练集和测试集 通过稀疏自编码器进行降维至20维度 自编器参数&#xff1a; # 训练自编码器模型autoencoder …