当前位置: 首页 > news >正文

大厂面试真题:说一说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各有优劣,在选择垃圾回收器时,应根据具体的应用场景和性能需求进行权衡和选择。

相关文章:

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

CMS垃圾回收器四个主要步骤 初始标记阶段(Initial Mark Phase) 目的:标记老年代中所有从GC Roots直接可达的对象。特点:此阶段会导致STW(Stop The World),即暂停应用程序的执行,但停…...

使用Qt Creator创建项目

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 使用Qt Creator创建项目 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 温馨提示: 1. 新…...

C++ 与 C 的那些事儿:深度剖析两者区别

在编程的世界里&#xff0c;C 和 C 就像是一对有着紧密血缘关系却又各具特色的兄弟。对于很多初学者或者有一定编程经验的人来说&#xff0c;分清它们之间的差异至关重要。今天&#xff0c;我们就来深入探讨一下 C 和 C 的区别。 <1>、C 是一种静态类型的、编译式的、通…...

学习​Redis 高可用性​

Redis 高可用性&#xff08;High Availability&#xff09;是指在 Redis 系统中实现持续的可用性&#xff0c;即使在发生硬件故障或其他意外情况下&#xff0c;系统仍能保持运行。 Redis 高可用性&#xff08;High Availability&#xff09;是指在 Redis 系统中实现持续的可用性…...

【含开题报告+文档+PPT+源码】基于springBoot+vue超市仓库管理系统的设计与实现

开题报告 随着电子商务的快速发展和物流行业的日益壮大&#xff0c;超市仓库管理系统的重要性也日益凸显。传统的超市仓库管理方式存在许多问题&#xff0c;比如人工操作繁琐、数据统计不准确、管理效率低下等。因此&#xff0c;需要设计和实现一个高效、智能的超市仓库管理系…...

美发店管理革新:SpringBoot系统的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理美发门店管理系统的相关信息成为必然。开发…...

C++从0到1

左值和右值&#xff1a; 左值左值是可以位于赋值操作左边的表达式。意味着左值代表一个对象的身份内存中的具体位置。可以被取地址&#xff0c;并且可以位于赋值操作的左边或右边右值右值是不能位于赋值操作左边的表达式。右值代表一个对象的值&#xff0c;通常是一个临时对象…...

VMware Tools 安装和配置

1. 使用 ISO 映射文件&#xff0c;并且选择.iso文件 2. 启动虚拟机&#xff0c;如果 VMware Tools 是灰色的&#xff0c;那么卸载 open-vm-tools&#xff08;不要重装&#xff09;&#xff0c;重新启动虚拟机。卸载可以参考&#xff1a;重装 open-vm-tools-CSDN博客 3. 拷贝挂载…...

云原生化 - 基础镜像(简约版)

根据最佳实践的建议&#xff0c;每个容器只做一件事&#xff0c;并尽可能减少基础镜像的内容&#xff0c;这里列举一些常用的基础镜像&#xff0c;可供选择。&#xff08;完整版请查阅这里&#xff09; 基础镜像推荐 1. BusyBox 描述&#xff1a;一个包含了许多常用UNIX工具的…...

云计算相关

文章目录 一、虚拟化1、虚拟化技术概述特点 2、虚拟化与云化3、计算虚拟化分类与作用常见的计算服务架构 4、存储虚拟化5、网络虚拟化 二、行业管理规章制度1、服务器管理制度访问控制变更管理备份与恢复监控与审计 2、操作系统安全管理规范更新与补丁管理用户账号管理防火墙与…...

人机协作:科技与人类智慧的融合

随着科技的飞速发展&#xff0c;越来越多的领域开始借助人工智能&#xff08;AI&#xff09;和自动化技术来提升工作效率。人机协作&#xff08;Human-Machine Collaboration&#xff09;这一概念逐渐成为现代技术进步的核心。它不仅改变了我们的工作方式&#xff0c;也在重新定…...

keras yolo8目标检测

是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车&#xff0c;卡车&#xff0c;交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…...

PowerJob做定时任务调度

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、区别对比二、使用步骤1. 定时任务类型2.PowerJob搭建与部署 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; PowerJob是基于java开…...

前后端分离开发YApid

开头先声明以下&#xff0c;这篇主要用于概念的介绍…… 在当今的互联网应用开发中&#xff0c;前后端分离逐渐成为主流的开发模式。相比于传统的前后端混合开发&#xff0c;这种新模式在灵活性、可维护性和团队协作等方面具有显著优势。 前后端混合开发 在前后端混合开发模式…...

leetcode 22.括号生成

思路&#xff1a;dfs回溯 其实这道题看起来很像栈&#xff0c;但考虑到多种可能方案输出&#xff0c;我们需要用dfs来做。 乍一看好像没啥思路。我们可以从括号的特点入手&#xff0c;括号我们知道都是成对存在的&#xff0c;那么无论多少对括号&#xff0c;其实第一个符号肯…...

如何启动一个OpenSearch

创建两个集群&#xff0c;标注 不含备用节点 选择集群版本和配置集群版本 冷热存储和专用主节点这个按需开启 然后是网络&#xff0c;是否使用自定义域名&#xff0c;集群开在VPC还是公网上。 选择是否开启认证&#xff1a; 访问策略&#xff0c;其实就是资源策略 维护时段…...

自媒体工具箱 v1.0,支持涂抹加水印、无水印下载、加水印、消除原声、视频压缩

自媒体工具箱&#xff0c;打开App&#xff0c;非常干净清爽&#xff0c;只有视频工具板块&#xff0c;总共有11个功能&#xff0c;包括涂抹加水印、无水印下载、加水印、消除原声、视频压缩等功能。...

python 自学总结

# 这是一个代码的注释 注释可以使用# 一般而言#号后面要加空格表示规范&#xff0c;多行注释使用“”“ ”“”符合包裹 # type()这个是判断变量类型# 变量的形式 meny 50 # 自己定义叫标识符 不可以使用关键字 不可以用字母开头 规范性 下划线命名法 英文字母全部小写 …...

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一种协议&#xff0c;用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接&#xff0c;这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发&#xff0c;并于2…...

【大模型】RMS Normalization原理及实现

1.RMS Normalization的原理 说RMS Normalization之前&#xff0c;先讲Layer Normalization 和 Batch Normalization。 BN和LN是两种常见的归一化方法。它们的目的是帮助模型训练更稳定、收敛更快。BN是在Batch维度上进行归一化&#xff0c;即对同一batch中每个特征维度的值进行…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

Python第七周作业

Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt&#xff0c;并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径&#xff0c;并创建logs目录&#xff08;若不存在&#xff09; 3.递归遍历目录data&#xff0c;输出所有.csv文件的路径…...