CMS垃圾收集

初始标记

需要暂停所有的其他线程,但这个阶段会很快完成。它的目的是标记所有的根对象,以及被根对象直接引用的对象,以及年轻代指向老年代的对象,不会遍历对象关系,单线程执行

并发标记阶段

不需要暂停应用线程,遍历对象图,标记可达对象。
可能产生漏标记的问题,会导致本该存活的对象被回收。如何解决这个问题?
在老年代对象引用关系改变的时候,把该对象所在的卡页标记为脏页(通过写屏障维护卡表),后续只需要扫描脏页而不是整个老年代。这个是CMS解决并发标记漏标的具体实现方案。

并发预处理阶段

不需要暂停应用线程
会扫描脏页的对象并遍历标记,然后清除脏标记。

可取消的并发预处理

为什么在可取消的并发预处理进行一次年轻代GC能减轻最终标记的工作?
如果一直没等到Minor GC,这个时候进行最终标记的话,可能会发生连续停顿,假设重新标记的时候新生代发生了Minor GC(STW),最终标记又是STW的,因此可能会发生连续停顿。

CMS提供了参数CMSScavengeBeforeRemark,使最终标记前强制进行一次Minor GC

这个参数有利有弊,利是降低了Remark阶段的停顿时间,弊的是在新生代对象很少的情况下也多了一次YGC,哪怕在可取消的并发预处理阶段已经发生了一次YGC,然后在该阶段又会去傻傻的触发一次。

重新标记

不暂停应用程序。因为它循环做同样的事情,直到满足某个退出条件。
1.处理 From 和 To 区的对象,标记可达的老年代对象
2.和上一个阶段一样,扫描处理Dirty Card中的对象。

在重新标记(Remark)阶段,实际上是要扫描整个堆内存的,包括新生代和老年代

这是因为在并发标记阶段,应用程序线程还在运行,可能会有新对象被分配到新生代,并且可能会有引用关系的改变。如果不扫描新生代,就可能会漏掉一些被引用的对象,导致误删。

但是实际上,由于各种优化技术,比如增量更新(Incremental Update)和卡表(Card Table),重新标记阶段可以只扫描部分区域。例如,只需要扫描在并发标记阶段中被修改过的那部分堆内存区域,而无需全盘扫描整个堆内存。

年轻代的扫描可以使用卡表?就是用上记录老年代到年轻代引用关系的卡表?

重新标记也是可以并发执行的。

可以通过-XX:ParallelRemarkEnabled,参数启用并行重新标记,它允许在重新标记阶段使用多线程。

请注意,这个选项不影响初始标记阶段,那个阶段仍将使用单线程执行

启用-XX:ParallelRemarkEnabled参数并行执行CMS的重新标记阶段可以减少垃圾回收时应用的停止时间,但也有可能带来一些缺点:

资源消耗:并行执行需要更多的CPU资源,如果系统上运行着其他需要CPU的任务,这可能会降低它们的性能。
复杂性增加:并行化处理通常增加了系统的复杂性,可能会导致更难预测和调试的性能问题。
不稳定性:尽管并行重新标记通常可以提高效率,但在某些特定硬件和工作负载下,可能会得到相反的结果。
因此,是否使用-XX:ParallelRemarkEnabled取决于具体的应用和硬件环境。在开启这个选项之前,最好先在仿真环境中进行充分的测试,以评估它对性能的影响。

并发清除

最后是并发清除阶段,在此阶段中,垃圾回收器删除未被标记的对象,并回收他们占用的内存空间,同样,该步骤也是与应用线程并发执行的。

这个过程,还是有可能用户线程在不断产生垃圾,但只能留到下一次GC 进行处理了,产生的这些垃圾被叫做浮动垃圾

CMS使用空闲列表(free-list),在并发清除阶段结束后,CMS会将未被标记的内存(即垃圾对象占据的内存)收集起来,组成一个空闲列表。

这个空闲列表保存了可用于新对象分配的内存块信息。当需要分配新对象时,JVM可以直接从空闲列表中找到合适大小的内存块进行分配,而无需进行完整的垃圾回收

但是,这种方法也有其缺点,例如可能会导致内存碎片化问题。如果连续的空闲内存块不足以满足新的内存请求,就需要触发一次完全的垃圾收集,此时则可能会引起较长时间的暂停。

缺点

1.CMS垃圾收集器是处理器资源敏感的。在并发阶段,它不会导致用户线程停顿,但会占用一部分线程(或者说处理器的计算能力)来进行垃圾回收,从而导致应用程序变慢降低总吞吐量。低延迟和高吞吐,往往无法同时达成,低延迟有时是牺牲高吞吐换得的。
CMS 回收线程数量可以通过-XX:ParallelCMSThreads=这个JVM参数来设定。

2.无法处理浮动垃圾。并发清理阶段,用户线程是还在继续运行的,程序在运行自然就还会伴随有新的垃圾对象不断产生。CMS无法在当次收集中处理掉它们,只能下一次垃圾回收来处理。

3.在垃圾收集阶段用户线程还需要持续运行,那就还需要预留足够内存空间提供给用户线程使用,因此CMS收集器不能像其他收集器那样等待到老年代几乎完全被填满了再进行收集。可以通过 -XX:CMSInitiatingOccupancyFraction 参数自行调节进行CMS回收的内存阈值。

如果CMS运行期间预留的内存无法满足程序分配新对象的需要,就会出现一次并发失败(Concurrent Mode Failure)。会触发触发STW,临时启用Serial Old收集器来重新进行老年代的垃圾收集,但这样停顿时间就很长了。Serial Old使用的是标记-整理(Mark-Compact)算法。

4.内存碎片可能导致Full GC。
空间碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很多剩余空间,但就是无法找到足够大的连续空间来分配当前对象,而不得不提前触发一次Full GC的情况。
CMS收集器提供了一个-XX:+UseCMS-CompactAtFullCollection,用于在CMS收集器不得不进行Full GC开启内存碎片的合并整理过程,但是整理过程又必须移动存活对象,这样空间碎片问题是解决了,但停顿时间又会变长

另外一个参数-XX:CMSFullGCsBefore-Compaction,这个参数的作用是要求CMS收集器在执行过若干次(数量由参数值决定)不整理空间的Full GC之后,下一次进入Full GC前会先进行碎片整理。虽然内存压缩可以减少内存碎片,提高内存利用效率,但同时也会增加GC的暂停时间

问题

1.Full GC指的是什么?
CMS GC是指老年代的GC,而Full GC指的是整个堆的GC事件,包括新生代、老年代、元空间等

参考

CMS
CMS

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

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

相关文章

数据集成平台选型建议

一 数据集成介绍 数据集成平台是一种用于管理和协调数据流动的软件工具或服务。它的主要目标是将来自多个不同数据源的数据整合到一个统一的、易于访问和分析的数据存储库中。这些数据源可以包括数据库、云应用、传感器、日志文件、社交媒体等等。数据集成平台的关键任务是确保…

linux 搞一个后悔药(回收站)—— 筑梦之路

主要功能 de(删除) dr(撤销) dl(列出回收站) cleardall(清空回收站) 如何实现 1. 创建一个隐藏目录 mkdir -p ~/.Recycle_bin 2. 修改 ~/.bashrc vim ~/.bashrc# 添加如下内容al…

[JavaWeb学习日记]Vue工程,springboot工程整合Mybatis,数据库索引

目录 一.Vue工程 安装NodeJS与Vue-cli Vue项目创建 启动Vue项目:点击npm脚本serve 改端口:在vue.config.js下 Vue文件组成:templatescriptstyle 使用element 前端服务器当前使用Ngix 主要编写的文件 二.SpringBoot的Web工程 启动带…

Android红外遥控ConsumerIrManager

目录 一、申请权限 二、ConsumerIrManager(消费者红外管理器) 三、判断是否有红外功能 四、发射红外信号 1.准备用于发射的信息 2.消费者红外管理器发射信息 五、案例代码一览 红外遥控是一种近红外光线(频率为几万赫兹)作为遥控光源的遥控方式。 在Android4.4后提供了…

腾讯云4核8G服务器支持多少人在线?CPU性能如何?

腾讯云轻量4核8G12M服务器配置446元一年,646元12个月,腾讯云轻量应用服务器具有100%CPU性能,系统盘为180GB SSD盘,12M带宽下载速度1536KB/秒,月流量2000GB,折合每天66.6GB流量,超出月流量包的流…

uniapp-vue3 项目初始化集成配置【开箱即用】

地址 https://gitee.com/charrie/vue3-uniapp-init 部分截图展示 技术说明 采用vue3viteuniapp技术栈,setup语法糖编码方式使用完全免费的sard-uniapp组件库引入unocss量子化样式引擎,动态css不用自己写样式,引用class即可,降低…

【SQL注入】Sqlmap使用指南(手把手保姆版)持续更新

文章目录 一、sqlmap介绍二、sqlmap命令行参数用法讲解2.1常用用法-u--batch--flush-session--dbms--level--random-agent--user-agent--tamper--technique-p--skip基础用法查询列表2.2 高阶用法-v高阶用法查询列表 一、sqlmap介绍 官网下载地址:https://github.co…

【LeetCode热题100】138. 随机链表的复制(链表)

一.题目要求 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值…

微信小程序H5设置全局弹窗

微信小程序&H5设置全局弹窗 微信小程序&H5设置全局弹窗效果图1、下载所需库2、创建vue.config.js 文件3、创建全局公告组件头部公告组件弹窗公告组件4、组件注册到全局5、在pages.json文件中配置 insetLoader6、H5需要额外使用render.js7、全局调用(一进入页面就获取弹…

18 OpenCV霍夫变换检测直线

文章目录 HoughLines 算子HoughLinesP 算子示例 HoughLines 算子 cv::HoughLines( InputArray src, // 输入图像,必须8-bit的灰度图像 OutputArray lines, // 输出的极坐标来表示直线 double rho, // 生成极坐标时候的像素扫描步长 double theta, //生成极坐标时候…

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库

Windows中在C#中使用Dapper和Mysql.Data库连接MySQL数据库 在Windows中使用C#连接Mysql数据库比较简单,可以直接使用MySql.Data库,目前最新版本为:8.3.0。 当然也可以结合MySql.Data和Dapper库一起使用,目前Dapper的最新版本为&a…

【黑马程序员】Python面向对象

文章目录 面向对象对象初始对象类的定义和使用语法代码示例 内置方法构造方法字符串方法比较方法__lt__方法__le__方法__eq__方法 封装私有成员使用私有成员 继承单继承多继承重写父类成员方法调用父类同名成员 类型注解变量注解对变量设置类型注解在注释中进行类型注解类型注解…

文本生成解码策略及其在transformers中的代码实现

诸神缄默不语-个人CSDN博文目录 开放式文本生成会偏好采样方法。 由于我要下班了,所以本文主要就写了第五节。别的内容请大家参考第六节给出的参考资料。 文章目录 1. 贪心搜索2. beam search3. top-k sampling4. top-p sampling5. 代码实践:transform…

解决ffmpeg播放摄像头延时的问题(项目案例使用有效)

第一1.目前使用的对接的海康威视的摄像机,并且采用的流媒体服务器NodeMediaServer 进行收数据流并发流数据。但是延时达到了20秒,所以客户看到的效果不是很乐观,没有办法,只能开始优化播放延时的问题,至于对接摄像头的方案有好几种。我这种情况是时间没有延迟只有画面是有…

vue 引用百度地图

address.vue <template><div><!-- 地图 --><el-drawer:visible.sync"type1"direction"rtl"size"50%"append-to-bodyclass"map-drawer":before-close"beforeClose"><div style"width: 100%…

CSS:过渡动画 (Transition)与关键帧动画(Keyfram)

一、过渡动画 (Transition) 1.简单介绍 Transition能为样式的变化提供过渡效果&#xff0c;例如在下面的代码中&#xff1a; .main {width: 300px;height: 100px;background-color: #d26f6f;}.main:hover {width: 300px;height: 200px;background-color: #5e3e3e;transition:…

语义分割前言

1.常见数据集 1.1PASCAL VOC 其标注图片为单通道图像&#xff0c;其0~255像素值为其取值范围&#xff0c;背景为0&#xff0c;目标区域内根据目标的类别索引信息进行填充。 1.2MS COCO 其标注图像的标注文件为坐标信息。 官网有给出一个关于标注文件的格式说明&#xff0…

数字信封

一、概念 数字信封是将对称密钥通过非对称加密&#xff08;即&#xff1a;有公钥和私钥两个&#xff09;的结果分发对称密钥的方法。数字信封是实现信息保密性验证的技术。 二、过程描述 在数字信封中&#xff0c;信息发送方采用对称密钥来加密信息内容&#xff0c;然后将此…

考虑源荷随机特征的热电联供微网优化(含matlab程序)

目录 一、前言 二、含可再生能源的CHP型微网系统 三、CCP理论 四、具体模型 五、不含随机变量分析的matlab程序设计 1.粒子群寻优功能代码段 2.目标函数子程序 3.其他代码段 六、基于CCP的粒子群优化程序 1.含随机变量的约束条件处理 2.随机变量生成 3.置信水平检验部…