大厂面试真题:说一说CMS和G1
CMS垃圾回收器四个主要步骤
-
初始标记阶段(Initial Mark Phase)
- 目的:标记老年代中所有从GC Roots直接可达的对象。
- 特点:此阶段会导致STW(Stop The World),即暂停应用程序的执行,但停顿时间较短。
- 执行内容:标记GC Roots直接引用的对象,以及年轻代中存活的对象引用到的老年代对象。
-
并发标记阶段(Concurrent Mark Phase)
- 目的:从初始标记阶段标记的对象开始,遍历整个对象图,找出所有存活的对象。
- 特点:此阶段与应用程序并发运行,不会暂停应用程序的执行。
- 执行内容:遍历对象图,标记所有可达的对象。
-
重新标记阶段(Remark Phase)
- 目的:修正并发标记阶段中可能因引用关系变更而遗漏的存活对象。
- 特点:此阶段也会导致STW,但停顿时间相对较短。
- 执行内容:扫描整个堆内存(包括年轻代和老年代),确保所有存活对象都被准确标记。
-
并发清除阶段(Concurrent Sweep Phase)
- 目的:清除那些没有被标记的对象,回收内存空间。
- 特点:此阶段与应用程序并发运行。
- 执行内容:回收未标记对象的内存空间,准备下一次垃圾回收。
需要注意的是,虽然我们将CMS垃圾回收器的过程概括为四个主要步骤,但每个步骤内部可能还包含更细致的子步骤或优化机制。此外,CMS垃圾回收器也面临一些挑战,如浮动垃圾问题(即在并发清除阶段新产生的垃圾无法立即被回收)和空间碎片问题(由于标记-清除算法可能导致内存碎片)。
为了优化CMS垃圾回收器的性能,可以通过调整JVM参数来减少停顿时间、提高吞吐量或降低内存碎片。例如,可以调整-XX:CMSInitiatingOccupancyFraction参数来控制CMS垃圾回收器触发的时机,或调整-XX:+UseCMSCompactAtFullGC参数来启用在Full GC时进行内存压缩以减少碎片。
G1垃圾回收器四个主要步骤
-
初始标记阶段(Initial Mark Phase)
- 目的:标记从GC Roots直接可达的对象,并修改TAMS(Top at Mark Start)指针,为并发标记阶段做准备。
- 特点:此阶段会导致STW(Stop The World),但停顿时间非常短,通常借用Minor GC时完成。
- 执行内容:标记GC Roots直接引用的对象,并更新TAMS指针以记录回收过程中新对象的分配。
-
并发标记阶段(Concurrent Marking Phase)
- 目的:从初始标记阶段标记的对象开始,递归扫描整个堆,对堆中对象进行可达性分析,找出要回收的对象。
- 特点:此阶段与应用程序并发运行,不会暂停应用程序的执行。使用SATB(Snapshot-At-The-Beginning)算法处理并发标记过程中的漏标对象。
- 执行内容:遍历对象图,标记所有可达的对象,并使用SATB算法记录并发过程中可能产生的漏标对象。
-
最终标记阶段(Remark Phase)
- 目的:处理并发标记阶段中遗漏的存活对象,并修正标记结果。
- 特点:此阶段也会导致STW,但停顿时间相对较短。
- 执行内容:扫描整个堆内存(或特定区域),确保所有存活对象都被准确标记,并修正并发标记阶段的标记结果。
-
筛选回收阶段(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的区别
-
工作原理:
- CMS:主要针对老年代进行垃圾回收,采用标记-清除算法。在回收过程中,大部分工作可以与应用程序线程并发执行,以减少停顿时间。但CMS在并发标记和清除阶段会占用一部分线程资源,可能导致应用程序变慢,总吞吐量降低。
- G1:是一个面向服务端应用的垃圾回收器,设计用于多处理器和大内存环境。它将堆内存划分为多个大小相同的区域(Region),并采用物理分区、逻辑分代的方式管理内存。G1使用标记-整理算法,在垃圾回收过程中会进行空间整合,避免内存碎片的产生。G1可以与应用程序线程并发执行垃圾回收,同时支持多个处理器并行处理垃圾回收任务,以提高效率。
-
停顿时间控制:
- CMS:虽然旨在减少停顿时间,但无法设置具体的目标停顿时间,其停顿时间相对不可控,主要取决于堆内存的大小、垃圾对象的数量以及垃圾回收的并发程度等因素。
- G1:通过设定-XX:MaxGCPauseMillis参数,可以更加精确地控制垃圾回收的停顿时间,以满足应用程序对响应时间的严格要求。G1使用了一个停顿预测模型,根据用户定义的停顿时间目标来选择一定数量的区域进行回收,从而尽量在指定的时间内完成垃圾回收。
-
内存碎片:
- CMS:由于采用标记-清除算法,可能会产生较多的内存碎片。内存碎片不仅会降低内存分配的效率,还可能导致大对象分配失败,进而引发Full GC。
- G1:采用复制-整理算法(新生代垃圾回收采用标记-赋值算法,老年代垃圾回收采用了标记-整理算法),在压缩空间方面有优势,可以有效避免内存碎片的产生。每次垃圾回收时,G1都会将对象从一个或多个区域复制到单个区域,并在复制过程中进行压缩,从而腾出连续的内存空间。
-
浮动垃圾:
- CMS:在并发清除阶段,垃圾回收线程和用户线程同时工作会产生浮动垃圾。CMS必须预留一部分内存空间用于存放浮动垃圾,如果预留给用户线程的内存不足,就会出现“ConcurrentMode Failure”,此时会切换到SerialOld收集方式,导致效率低下。
- G1:没有浮动垃圾的问题。G1的筛选回收是多个垃圾回收线程并行执行的,没有并发清除阶段,因此不会产生浮动垃圾。
适用场景
-
CMS:
- 适用于对CPU资源敏感且对停顿时间要求较高的应用,如实时交易系统、在线游戏等。在这些场景中,CMS能够减少垃圾回收对应用程序性能的影响,同时保持较低的停顿时间。
-
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 的那些事儿:深度剖析两者区别
在编程的世界里,C 和 C 就像是一对有着紧密血缘关系却又各具特色的兄弟。对于很多初学者或者有一定编程经验的人来说,分清它们之间的差异至关重要。今天,我们就来深入探讨一下 C 和 C 的区别。 <1>、C 是一种静态类型的、编译式的、通…...
学习Redis 高可用性
Redis 高可用性(High Availability)是指在 Redis 系统中实现持续的可用性,即使在发生硬件故障或其他意外情况下,系统仍能保持运行。 Redis 高可用性(High Availability)是指在 Redis 系统中实现持续的可用性…...
【含开题报告+文档+PPT+源码】基于springBoot+vue超市仓库管理系统的设计与实现
开题报告 随着电子商务的快速发展和物流行业的日益壮大,超市仓库管理系统的重要性也日益凸显。传统的超市仓库管理方式存在许多问题,比如人工操作繁琐、数据统计不准确、管理效率低下等。因此,需要设计和实现一个高效、智能的超市仓库管理系…...
美发店管理革新:SpringBoot系统的应用
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理美发门店管理系统的相关信息成为必然。开发…...
C++从0到1
左值和右值: 左值左值是可以位于赋值操作左边的表达式。意味着左值代表一个对象的身份内存中的具体位置。可以被取地址,并且可以位于赋值操作的左边或右边右值右值是不能位于赋值操作左边的表达式。右值代表一个对象的值,通常是一个临时对象…...
VMware Tools 安装和配置
1. 使用 ISO 映射文件,并且选择.iso文件 2. 启动虚拟机,如果 VMware Tools 是灰色的,那么卸载 open-vm-tools(不要重装),重新启动虚拟机。卸载可以参考:重装 open-vm-tools-CSDN博客 3. 拷贝挂载…...
云原生化 - 基础镜像(简约版)
根据最佳实践的建议,每个容器只做一件事,并尽可能减少基础镜像的内容,这里列举一些常用的基础镜像,可供选择。(完整版请查阅这里) 基础镜像推荐 1. BusyBox 描述:一个包含了许多常用UNIX工具的…...
云计算相关
文章目录 一、虚拟化1、虚拟化技术概述特点 2、虚拟化与云化3、计算虚拟化分类与作用常见的计算服务架构 4、存储虚拟化5、网络虚拟化 二、行业管理规章制度1、服务器管理制度访问控制变更管理备份与恢复监控与审计 2、操作系统安全管理规范更新与补丁管理用户账号管理防火墙与…...
人机协作:科技与人类智慧的融合
随着科技的飞速发展,越来越多的领域开始借助人工智能(AI)和自动化技术来提升工作效率。人机协作(Human-Machine Collaboration)这一概念逐渐成为现代技术进步的核心。它不仅改变了我们的工作方式,也在重新定…...
keras yolo8目标检测
是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车,卡车,交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…...
PowerJob做定时任务调度
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、区别对比二、使用步骤1. 定时任务类型2.PowerJob搭建与部署 前言 提示:这里可以添加本文要记录的大概内容: PowerJob是基于java开…...
前后端分离开发YApid
开头先声明以下,这篇主要用于概念的介绍…… 在当今的互联网应用开发中,前后端分离逐渐成为主流的开发模式。相比于传统的前后端混合开发,这种新模式在灵活性、可维护性和团队协作等方面具有显著优势。 前后端混合开发 在前后端混合开发模式…...
leetcode 22.括号生成
思路:dfs回溯 其实这道题看起来很像栈,但考虑到多种可能方案输出,我们需要用dfs来做。 乍一看好像没啥思路。我们可以从括号的特点入手,括号我们知道都是成对存在的,那么无论多少对括号,其实第一个符号肯…...
如何启动一个OpenSearch
创建两个集群,标注 不含备用节点 选择集群版本和配置集群版本 冷热存储和专用主节点这个按需开启 然后是网络,是否使用自定义域名,集群开在VPC还是公网上。 选择是否开启认证: 访问策略,其实就是资源策略 维护时段…...
自媒体工具箱 v1.0,支持涂抹加水印、无水印下载、加水印、消除原声、视频压缩
自媒体工具箱,打开App,非常干净清爽,只有视频工具板块,总共有11个功能,包括涂抹加水印、无水印下载、加水印、消除原声、视频压缩等功能。...
python 自学总结
# 这是一个代码的注释 注释可以使用# 一般而言#号后面要加空格表示规范,多行注释使用“”“ ”“”符合包裹 # type()这个是判断变量类型# 变量的形式 meny 50 # 自己定义叫标识符 不可以使用关键字 不可以用字母开头 规范性 下划线命名法 英文字母全部小写 …...
Java - WebSocket
一、WebSocket 1.1、WebSocket概念 WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发,并于2…...
【大模型】RMS Normalization原理及实现
1.RMS Normalization的原理 说RMS Normalization之前,先讲Layer Normalization 和 Batch Normalization。 BN和LN是两种常见的归一化方法。它们的目的是帮助模型训练更稳定、收敛更快。BN是在Batch维度上进行归一化,即对同一batch中每个特征维度的值进行…...
OpenClaw负载测试:GLM-4.7-Flash并发处理能力评估
OpenClaw负载测试:GLM-4.7-Flash并发处理能力评估 1. 测试背景与目标 上周在尝试用OpenClaw自动化处理一批市场调研报告时,遇到了一个典型问题:当我同时提交20份PDF文件让AI助手提取关键数据时,系统开始出现响应延迟和部分任务超…...
基于三相两电平逆变器的VSG并网系统:电压电流双闭环控制的仿真研究
VSG并网,基于三相两电平逆变器的虚拟同步机并网,电压电流双闭环控制 1.VSG 2.电压电流双闭环 3..提供相关参考文献 支持simulink2022以下版本,联系跟我说什么版本,我给转成你版本(默认发2016b)。最近在研究…...
GNSS说第(八)讲---自适应动态导航定位(八)---抗差估计在复杂环境下的应用实践
1. 抗差估计:GNSS定位的"防弹衣" 想象一下你在高楼林立的城市峡谷中打开手机导航,信号时断时续,定位图标像喝醉酒一样到处乱飘——这就是典型的多路径干扰场景。传统最小二乘法就像用普通尺子测量扭曲的橡皮筋,单个异常…...
全基因组序列比对工具mVISTA的保姆级使用指南:从文件准备到结果解读
全基因组序列比对工具mVISTA的保姆级使用指南:从文件准备到结果解读 在基因组学研究领域,序列比对是揭示物种间进化关系、识别保守区域和功能元件的基础操作。mVISTA作为一款专门用于全基因组序列比对的在线工具,凭借其直观的可视化界面和强…...
Nimbus:一个统一的具身合成数据生成框架
Zeyu He, Yuchang Zhang, Yuanzhen Zhou, Miao Tao, Hengjie Li,∗, Hui Wang, Yang Tian, Jia Zeng, Tai Wang, Wenzhe Cai, Yilun Chen, Ning Gao, Jiangmiao Pang摘要扩大数据规模和多样性对于泛化具身智能至关重要。虽然合成数据生成为昂贵的物理数据采集提供了可扩展的替代…...
嵌入式软件工程师面试技术要点解析
嵌入式软件工程师面试技术要点解析1. 通信接口技术1.1 RS-485通信特性RS-485标准采用差分信号传输,物理层上支持全双工通信,但在实际应用中通常配置为半双工模式。这种设计选择主要基于以下工程考虑:半双工模式下只需一对双绞线,显…...
避开这3个坑!用Solidworks链阵列做皮带挡板时90%人会犯的错误
避开这3个坑!用Solidworks链阵列做皮带挡板时90%人会犯的错误 在机械设计领域,Solidworks的链阵列功能是创建皮带挡板这类重复性结构的利器。但看似简单的操作背后,却隐藏着几个容易导致失败的陷阱。很多中级用户在使用链阵列功能时ÿ…...
Cesium1.95内存优化实战:从3D Tiles到GPU Instancing的完整避坑指南
Cesium1.95内存优化实战:从3D Tiles到GPU Instancing的完整避坑指南 在三维地理信息系统和智慧城市项目中,Cesium作为领先的WebGL框架,其性能表现直接决定了复杂场景的流畅度。当遇到大规模模型加载时,内存溢出成为开发者最头疼的…...
Java中高效移除文本文件标点符号的实用指南
本教程详细阐述了在Java中从文本文件中有效删除标点符号的方法。我们将使用Java NIO的Files.lines()结合Streamm API,重点介绍正则表达式p{Punct}强大的功能,以简单、强大的方式实现文本清洁,避免传统硬编码的局限性,从而提高文本…...
RTX 4090D专属PyTorch 2.8镜像:支持torch.distributed多卡训练教程
RTX 4090D专属PyTorch 2.8镜像:支持torch.distributed多卡训练教程 1. 镜像环境介绍 1.1 硬件与软件配置 这个专为RTX 4090D优化的PyTorch 2.8镜像提供了完整的深度学习训练环境,主要配置包括: 显卡支持:专为RTX 4090D 24GB显…...
