大厂面试真题:说一说CMS和G1

CMS垃圾回收器四个主要步骤

  1. 初始标记阶段(Initial Mark Phase)

    • 目的:标记老年代中所有从GC Roots直接可达的对象。
    • 特点:此阶段会导致STW(Stop The World),即暂停应用程序的执行,但停顿时间较短。
    • 执行内容:标记GC Roots直接引用的对象,以及年轻代中存活的对象引用到的老年代对象。
  2. 并发标记阶段(Concurrent Mark Phase)

    • 目的:从初始标记阶段标记的对象开始,遍历整个对象图,找出所有存活的对象。
    • 特点:此阶段与应用程序并发运行,不会暂停应用程序的执行。
    • 执行内容:遍历对象图,标记所有可达的对象。
  3. 重新标记阶段(Remark Phase)

    • 目的:修正并发标记阶段中可能因引用关系变更而遗漏的存活对象。
    • 特点:此阶段也会导致STW,但停顿时间相对较短。
    • 执行内容:扫描整个堆内存(包括年轻代和老年代),确保所有存活对象都被准确标记。
  4. 并发清除阶段(Concurrent Sweep Phase)

    • 目的:清除那些没有被标记的对象,回收内存空间。
    • 特点:此阶段与应用程序并发运行。
    • 执行内容:回收未标记对象的内存空间,准备下一次垃圾回收。

需要注意的是,虽然我们将CMS垃圾回收器的过程概括为四个主要步骤,但每个步骤内部可能还包含更细致的子步骤或优化机制。此外,CMS垃圾回收器也面临一些挑战,如浮动垃圾问题(即在并发清除阶段新产生的垃圾无法立即被回收)和空间碎片问题(由于标记-清除算法可能导致内存碎片)。

为了优化CMS垃圾回收器的性能,可以通过调整JVM参数来减少停顿时间、提高吞吐量或降低内存碎片。例如,可以调整-XX:CMSInitiatingOccupancyFraction参数来控制CMS垃圾回收器触发的时机,或调整-XX:+UseCMSCompactAtFullGC参数来启用在Full GC时进行内存压缩以减少碎片。

G1垃圾回收器四个主要步骤

  1. 初始标记阶段(Initial Mark Phase)

    • 目的:标记从GC Roots直接可达的对象,并修改TAMS(Top at Mark Start)指针,为并发标记阶段做准备。
    • 特点:此阶段会导致STW(Stop The World),但停顿时间非常短,通常借用Minor GC时完成。
    • 执行内容:标记GC Roots直接引用的对象,并更新TAMS指针以记录回收过程中新对象的分配。
  2. 并发标记阶段(Concurrent Marking Phase)

    • 目的:从初始标记阶段标记的对象开始,递归扫描整个堆,对堆中对象进行可达性分析,找出要回收的对象。
    • 特点:此阶段与应用程序并发运行,不会暂停应用程序的执行。使用SATB(Snapshot-At-The-Beginning)算法处理并发标记过程中的漏标对象。
    • 执行内容:遍历对象图,标记所有可达的对象,并使用SATB算法记录并发过程中可能产生的漏标对象。
  3. 最终标记阶段(Remark Phase)

    • 目的:处理并发标记阶段中遗漏的存活对象,并修正标记结果。
    • 特点:此阶段也会导致STW,但停顿时间相对较短。
    • 执行内容:扫描整个堆内存(或特定区域),确保所有存活对象都被准确标记,并修正并发标记阶段的标记结果。
  4. 筛选回收阶段(Live Data Counting And Evacuation Phase)

    • 目的:制定回收计划,选择多个Region构成回收集,并回收其中的垃圾对象。
    • 特点:此阶段可能包含STW,具体取决于回收策略和回收集的大小。
    • 执行内容:对各个Region的回收价值和成本进行排序,根据用户期望的停顿时间制定回收计划。然后,将回收集中Region的存活对象复制到空的Region中,并清理掉整个旧Region的全部空间。此阶段可能包含Young GC和Mixed GC两种回收模式。

G1垃圾回收器的设计目标是减少停顿时间,适用于对延迟敏感的应用。它通过引入分区(Region)和分治策略,将堆内存划分为多个固定大小的Region,并独立管理这些Region的垃圾回收过程。此外,G1还使用了RSet(Remembered Set)数据结构来记录跨代引用关系,以提高GC效率。

为了优化G1垃圾回收器的性能,可以通过调整JVM参数来控制其行为。例如,可以调整-XX:MaxGCPauseMillis参数来设置期望的最大GC停顿时间,或调整-XX:G1HeapRegionSize参数来设置Region的大小。这些参数可以帮助G1更好地适应不同的应用场景和性能需求。

CMS与G1的区别

  1. 工作原理

    • CMS:主要针对老年代进行垃圾回收,采用标记-清除算法。在回收过程中,大部分工作可以与应用程序线程并发执行,以减少停顿时间。但CMS在并发标记和清除阶段会占用一部分线程资源,可能导致应用程序变慢,总吞吐量降低。
    • G1:是一个面向服务端应用的垃圾回收器,设计用于多处理器和大内存环境。它将堆内存划分为多个大小相同的区域(Region),并采用物理分区、逻辑分代的方式管理内存。G1使用标记-整理算法,在垃圾回收过程中会进行空间整合,避免内存碎片的产生。G1可以与应用程序线程并发执行垃圾回收,同时支持多个处理器并行处理垃圾回收任务,以提高效率。
  2. 停顿时间控制

    • CMS:虽然旨在减少停顿时间,但无法设置具体的目标停顿时间,其停顿时间相对不可控,主要取决于堆内存的大小、垃圾对象的数量以及垃圾回收的并发程度等因素。
    • G1:通过设定-XX:MaxGCPauseMillis参数,可以更加精确地控制垃圾回收的停顿时间,以满足应用程序对响应时间的严格要求。G1使用了一个停顿预测模型,根据用户定义的停顿时间目标来选择一定数量的区域进行回收,从而尽量在指定的时间内完成垃圾回收。
  3. 内存碎片

    • CMS:由于采用标记-清除算法,可能会产生较多的内存碎片。内存碎片不仅会降低内存分配的效率,还可能导致大对象分配失败,进而引发Full GC。
    • G1:采用复制-整理算法(新生代垃圾回收采用标记-赋值算法,老年代垃圾回收采用了标记-整理算法),在压缩空间方面有优势,可以有效避免内存碎片的产生。每次垃圾回收时,G1都会将对象从一个或多个区域复制到单个区域,并在复制过程中进行压缩,从而腾出连续的内存空间。
  4. 浮动垃圾

    • CMS:在并发清除阶段,垃圾回收线程和用户线程同时工作会产生浮动垃圾。CMS必须预留一部分内存空间用于存放浮动垃圾,如果预留给用户线程的内存不足,就会出现“ConcurrentMode Failure”,此时会切换到SerialOld收集方式,导致效率低下。
    • G1:没有浮动垃圾的问题。G1的筛选回收是多个垃圾回收线程并行执行的,没有并发清除阶段,因此不会产生浮动垃圾。

适用场景

  1. CMS

    • 适用于对CPU资源敏感且对停顿时间要求较高的应用,如实时交易系统、在线游戏等。在这些场景中,CMS能够减少垃圾回收对应用程序性能的影响,同时保持较低的停顿时间。
  2. G1

    • 适用于需要处理大堆内存、对吞吐量有较高要求且对停顿时间有一定容忍度的应用,如企业级服务器、大数据处理平台等。G1能够充分利用多核处理器和大内存资源,提高垃圾回收的效率和性能。同时,G1还能够提供可预测的停顿时间,以满足应用程序对响应时间的严格要求。

综上所述,CMS和G1各有优劣,在选择垃圾回收器时,应根据具体的应用场景和性能需求进行权衡和选择。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Docker搭建WAF-开源Web防火墙VeryNginx

1、说明 VeryNginx 基于 lua_nginx_module(openrestry) 开发,实现了防火墙、访问统计和其他的一些功能。 集成在 Nginx 中运行,扩展了 Nginx 本身的功能,并提供了友好的 Web 交互界面。 文章目录 1、说明1.1、基本概述1.2、主要功能1.3、应用场景2、拉取镜像3、配置文件4、…

kafka-manager修改zookeeper端口号后启动仍然连接2181端口

问题描述: zookeeper默认端口号修改为了2182,kafka-manager的配置文件application.conf中也已经修改了zkhosts为新的端口号,然而启动kafka-manger时报错连接连接超时,发现连接的还是2181端口,很奇怪?&…

【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

C++题 十进制转二进制

文章目录 1. 使用C20 std::format2. 使用 std::bitset 类3. 手动实现十进制到二进制的转换反过来,手动二进制到十进制 VisualStudio2022使用C,进行十进制到二进制的转换,常见的实现方式 1. 使用C20 std::format 需要将VisualStudio默认的标准…

Linux高阶——0928—Github本地仓库与云端仓库关联

1、安装代理软件 steam 选择Github和系统代理模式,一键加速即可 2、 安装Git 3、访问Github网站,创建新用户 4、Github探索 (1)Explore探索标签 (2)工程结构 用户名/仓库名 自述文件,用markdo…

【笔记】I/O总结王道强化视频笔记

文章目录 从中断控制器的角度来理解整个中断处理的过程复习 处理器的中断处理机制**中断驱动I/O方式** printf——从系统调用到I/O控制方式的具体实现1轮询方式下输出一个字符串(程序查询)中断驱动方式下输出一个字符串中断服务程序中断服务程序与设备驱动程序之间的关系 DMA方…

线性代数在大一计算机课程中的重要性

线性代数在大一计算机课程中的重要性 线性代数是一门研究向量空间、矩阵运算和线性变换的数学学科,在计算机科学中有着广泛的应用。大一的计算机课程中,线性代数的学习为学生们掌握许多计算机领域的关键概念打下了坚实的基础。本文将介绍线性代数的基本…

数据库——创立表和库

数据库(Database)是一个用于存储、管理和检索数据的系统。它可以组织结构化数据,支持高效的存取和操作。数据库通常由一个数据库管理系统(DBMS)来支持,常见的DBMS包括: 关系数据库(R…

Java创建型模式(二)——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、工厂模式扩展等完整详解,附有代码——案例)

文章目录 五.工厂模式5.1 概述5.2简单工厂模式5.2.1 概述5.2.2 结构5.2.3 实现5.2.4 优缺点5.2.5 扩展—静态工厂 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现5.3.4 优缺点 5.4 抽象工厂模式5.4.1 概述5.4.2 结构5.4.3 实现5.4.4 优缺点5.4.5 使用场景 5.5 工厂模式扩展 五…

R语言机器学习算法实战系列(三)lightGBM算法(Light Gradient Boosting Machine)

文章目录 介绍原理:应用方向:教程下载数据加载R包导入数据数据预处理数据描述数据切割设置数据对象调节参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve特征的重要性模型SHAP值解释保存模型总结系统信息介绍 LightGBM(Light Gradient B…

MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式,可以使用JacksonTypeHandler处理器。使用方式非常简单,如下所示: 在domain实体类里面要加上,两个注解 TableName(autoResultMap true) 表示自动…

腾讯云-云直播

云直播(Cloud Streaming Services)为您提供极速、稳定、专业的直播云端处理服务,根据业务中不同直播场景的需求,云直播提供标准直播、快直播、慢直播和云导播台服务,分别针对大规模实时观看、高并发推流录制及超低延时…

数学建模算法与应用 第11章 偏最小二乘回归及其方法

目录 11.1 偏最小二乘回归概述 11.2 Matlab 偏最小二乘回归命令 Matlab代码示例:偏最小二乘回归 11.3 案例分析:化学反应中的偏最小二乘回归 Matlab代码示例:光谱数据的PLS回归 习题 11 总结 偏最小二乘回归(Partial Least …

如何加密重要U盘?U盘怎么加密保护?

在日常生活中,我们常常使用U盘来存储和传输重要文件。然而,U盘的便携性也意味着它容易丢失或被盗。为了保护U盘中的数据安全,我们需要对U盘进行加密。本文将为您介绍如何加密重要U盘,以及U盘加密保护的方法。 BitLocker BitLocke…

动态规划——多状态动态规划问题

目录 一、打家劫舍 二、打家劫舍 II 三、删除并获得点数 四、粉刷房子 五、买卖股票的最佳时机含冷冻期 六、买卖股票的最佳时机含手续费 七、买卖股票的最佳时机III 八、买卖股票的最佳时机IV 一、打家劫舍 打家劫舍 第一步:确定状态表示 当我们每次…

『Mysql进阶』Mysql SQL语句性能分析(七)

目录 什么是Profile? 开启Profile功能 基本使用 分析案例 什么是Profile? Query Profiler是 MySQL 自带的一种 Query 诊断分析工具 ,通过它可以分析出一条 SQL 语句的 硬件性能瓶颈 在什么地方。 通常我们是使用的 explain ,…

企业内部文档安全外发如何挑选合适的外发系统?

企业文档的外发不仅关系到运营效率,更是信息安全的重要组成部分。面对B2B模式下文档交换的普遍性和重要性,企业内部文档的安全外发成为了众多公司关注的重点之一。 随着互联网技术的发展,企业之间的合作越来越紧密,文档的交流也变…

springboot+react实现移动端相册(上传图片到oss/ 批量删除/ 查看图片详情等功能)

相册页面及功能展示: react前端结构及代码: Java后端结构及代码 数据库结构: photo: user 这是首个利用AI自有知识构建的简易相册系统,项目是react构造前端spring boot构造后端。 前端有四个主要页面&#xff1…

Compose第六弹 对话框与弹窗

1.compose中怎么使用对话框? 2.怎么显示Popup弹窗? 一、Compose显示对话框 二、Popup Popup就类似以前的Popupwindow,我们可以看到其实上面的DropdownMenu是Popup的一个具体实现。 2.1 Popup定义 Popup的定义如下: Composable…

Windows 下 cocos2d-x-3.17.2 VS2017开发环境搭建

1.下载cocos2d-x-3.17.2 源码: Cocos2d-x - 成熟、轻量、开放的跨平台解决方案 2.下载Python2 Python 2.7.0 Release | Python.org 加入环境变量: 测试版本