深入浅出JVM(十七)之并发垃圾收集器CMS

上篇文章介绍用户线程与GC线程并发执行时可能产生的问题以及使用三色标记法演示原始快照和增量更新两种解决方案

这篇文章将主要介绍并发垃圾收集器中的CMS,其中CMS使用增量更新来解决对象消失问题,如果不了解增量更新的同学可以查看上篇文章深入浅出JVM(十六)之三色标记法与并发可达性分析

前言

前文描述过,当GC时需要枚举的GC根节点需要极短的停顿(STW)

而在遍历GC引用链时,如果用户线程是停顿的,那么不会改变引用,GC线程遍历标识即可

但随着堆内存中对象的增多,引用链会越来越长,如果持续让用户线程停顿,在某些需要低延迟的场景是不理想的

因此希望能在这个环节让用户线程和GC线程能够并发执行,并发执行就会存在改变对象引用,可能导致对象消失问题,其中可以使用增量更新和原始快照的方式解决,而CMS使用的就是增量更新

Concurrent Mark Sweep

CMS全称Concurrent Mark Sweep 并发标记清除收集器

CMS是老年代收集器,采用标记-清除算法,年轻代常用ParNew收集器,以最短停顿时间(低延迟)为目标的收集器

CMS并没有使用标记-整理算法,因为标记、清理阶段是和用户线程并发执行的,如果使用标记-整理算法可能会导致移动引用的位置导致出错

执行步骤
  1. 初始标记: 标记GC Roots直接关联的对象(STW时间极短)
  1. 并发标记: 从GC Roots直接关联对象开始遍历整个引用链的过程(耗时长,不需要停顿用户线程,用户线程与GC线程并发执行)
  1. 重新标记: 使用增量更新避免对象消失问题,修正并发标记期间改动的对象(需要STW,耗时比步骤1长,比步骤2短)
  1. 并发清除: 清理标记阶段判断已死亡的对象、重置状态等(该阶段也是并发执行)

执行图

image.png

参数设置
  • -XX:UseConcMarkSweepGC

    • 老年代使用CMS垃圾收集器,新生代使用ParNew收集器
  • -XX:CMSInitiatingOccupancyFraction

    • 设置老年代使用多少空间时开始垃圾回收
      • 如果设置的太高,不够内存分配,不能满足并发执行,就会冻结用户线程启动Serial Old收集器,停顿时间就会变长
      • 如果内存增长缓慢可以设置高一些,如果内存增长很快就要设置低一些 默认92%
  • -XX:+UseCMSCompactAtFullCollection

    • 指定在FULL GC后是否对内存进行压缩整理
    • 开启后,通过-XX:CMSFullGCsBeforeCompaction设置执行多少次FULL GC后进行内存压缩整理
  • -XX:ParallelCMSThreads

    • 设置GC线程数量
特点

优点:

  1. 停顿时间短

    只在初始标记,重新标记时STW

  2. 并发执行

    时间长的并发标记和并发清理与用户线程,加快响应速度,提升用户体验

缺点:

  1. 吞吐量降低

    在处理器核数少时,GC线程与用户线程并发执行(使用i-CMS解决:减少GC线程独占时间,垃圾回收时间变长,对用户线程执行影响变小)

  2. 无法处理浮动垃圾

    增量更新通过记录新增引用来避免对象消失问题,可能出现浮动垃圾(不能在这一次的GC中被回收,只能下一次GC时被回收)

    CMS不能等老年代满了再垃圾回收,因为与用户线程并发执行,所以需要留一部分内存

  3. 内存碎片多

    多次垃圾回收后进行一次标记-整理算法,采用替补方案Serial Old

总结

本文根据并发垃圾收集器CMS深入浅出的解析CMS执行流程、优缺点以及配置参数等

CMS是一款主打低延迟、使用标记-清除算法的老年代并发垃圾收集器,年轻代常使用ParNew

CMS在初始标记时进行STW,接下来遍历引用链时与用户线程并发执行,然后让用户线程短暂STW使用增量更新进行重新标记,最后在并发进行清理、重置等工作

CMS的特点是在遍历引用链、清理时并发执行,能够使用户线程的停顿时间变短;但是带来吞吐量的降低,并且增量更新会导致浮动垃圾的出现,由于老年代使用标记-清除算法,不整理内存将会导致大对象无法存储,替补方案是使用Serial Old单线程标记-整理

如果老年代内存不足或需要整理内存时,会使用Serial Old 单线程处理,这可能导致延迟更高,在高版本中已经有G1等其他垃圾收集器代替CMS,CMS在JDK14时被移除

最后(一键三连求求拉~)

本篇文章将被收入JVM专栏,觉得不错感兴趣的同学可以收藏专栏哟~

本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

【k8s 高级调度--污点和容忍】

1、调度概念 在 Kubernetes 中,调度(scheduling)指的是确保 Pod 匹配到合适的节点, 以便 kubelet 能够运行它们。 抢占(Preemption)指的是终止低优先级的 Pod 以便高优先级的 Pod 可以调度运行的过程。 驱逐…

为什么会对猫毛过敏?如何缓解?浮毛克星—宠物空气净化器推荐

猫咪过敏通常是因为它们身上的Fel d1蛋白质导致的,这些蛋白质附着在猫咪的皮屑上。猫咪舔毛的过程会带出这些蛋白质,一旦接触就可能引发过敏症状,比如打喷嚏等。因此,减少空气中的浮毛数量有助于减轻过敏现象。猫用空气净化器可以…

Tomcat架构分析

Tomcat的核心组件 Tomcat将请求器和处理器分离,使用多种请求器支持不同的网络协议,而处理器只有一个。从而网络协议和容器解耦。 Tomcat的容器 Host:Tomcat提供多个域名的服务,其将每个域名都视为一个虚拟的主机,在…

【MySQL】_联合查询基础表

联合查询也称为多表查询,是将多个表联合到一起进行查询; 笛卡尔积是联合查询的基础,笛卡尔积其实就是一种排列组合,把两张表的记录尽可能地排列组合出n种情况: 以两张表:班级表与学生表为例,计…

半导体行业案例:Jira与龙智插件助力某半导体企业实现精益项目管理

近日,龙智Atlassian技术团队收到了国内一家大型半导体企业的感谢信。龙智团队提供的半导体行业项目管理解决方案和服务受到了客户的好评: 在龙智团队的支持下,我们的业务取得了喜人的成果和进步。龙智公司的专业服务和产品,是我们…

skiplist(高阶数据结构)

目录 一、概念 二、实现 三、对比 一、概念 skiplist是由William Pugh发明的,最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》 skiplist本质上是一种查找结构,用于解决算法中的查找问题,…

AI:145-智能监控系统下的行人安全预警与法律合规分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

【Redis】redis简介与安装

Redis 简介 Redis 是完全开源的,遵守 BSD 协议(Berkeley Software Distribution 意思是"伯克利软件发行版),是一个高性能的 key-value 数据库。具有以下几个比较明显的特点: 性能极高 – Redis能读的速度可以达…

2024年阿里云2核4G配置服务器测评_ECS和轻量性能测评

阿里云2核4G服务器多少钱一年?2核4G服务器1个月费用多少?2核4G服务器30元3个月、85元一年,轻量应用服务器2核4G4M带宽165元一年,企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

Vue3制作一个可拖拽的小箭头

效果图 可以抓住小箭头进行左右拖拽&#xff0c;不会做git图&#xff0c;所以只有静态效果QAQ 代码 <template><div class"tip"draggable"true"dragstart"start" //拖拽开始时drag"dragging" //拖拽种dragend "…

2024.2.27每日一题

之前是出去旅游了没发&#xff0c;现在开学了&#xff0c;继续每日一题&#xff0c;继续卷&#xff0c;一上来就是困难题&#x1f613;&#xff0c;直接cv大法。 LeetCode 统计树中的合法路径数目 2867. 统计树中的合法路径数目 - 力扣&#xff08;LeetCode&#xff09; 题目…

选择何种操作系统作为网站服务器

选择操作系统时&#xff0c;需考虑稳定性、安全性、成本、兼容性和技术支持等因素&#xff0c;常见选项有Windows Server和Linux发行版。 选择网站服务器的操作系统是一个关键的决策&#xff0c;因为它将影响到网站的性能、稳定性、安全性以及未来的扩展性&#xff0c;目前市场…

PMP考试之20240229

1、两个团队成员讨论一个关于服务器配置的问题&#xff0c;当第一个成员问为什么这个问题一直发生时&#xff0c;第二个成员说服务器参数混乱&#xff0c;使他很难处理它的配置。第一个团队成员建议他们应该在接下来的几次服务器配置中进行咨询&#xff0c;第二个团队成员同意并…

数据库之ACID

一、ACID **原子性&#xff08;Atomicity&#xff09;&#xff1a;**即事务是不可分割的最小工作单元&#xff0c;事务内的操作要么全做&#xff0c;要么全不做&#xff0c;不能只做一部分&#xff1b; 一致性&#xff08;Consistency&#xff09;&#xff1a;在事务执行前数据…

oauth2.0怎么和jwt结合

OAuth 2.0 和 JWT 可以结合使用&#xff0c;以提供安全的身份验证和授权机制。在结合使用 OAuth 2.0 和 JWT 时&#xff0c;通常是使用 OAuth 2.0 进行用户授权和颁发访问令牌&#xff0c;而 JWT 则用作访问令牌&#xff08;Access Token&#xff09;。 下面是 OAuth 2.0 和 J…

NineData:从 Kafka 到 ClickHouse 的数据同步解决方案

在大数据处理领域&#xff0c;Apache Kafka 和 ClickHouse 都是非常重要的工具。Kafka 是一个分布式流处理平台&#xff0c;被数千家公司用于高性能数据管道、流式分析、数据集成和关键任务应用&#xff0c;如今已成为数据交换、数据集成、数据流转过程中的核心组件。而 ClickH…

【大数据】Flink SQL 语法篇(八):集合、Order By、Limit、TopN

Flink SQL 语法篇&#xff08;八&#xff09;&#xff1a;集合、Order By、Limit、TopN 1.集合操作2.Order By、Limit 子句2.1 Order By 子句2.2 Limit 子句 3.TopN 子句 1.集合操作 集合操作支持 Batch / Streaming 任务。 UNION&#xff1a;将集合合并并且去重。UNION ALL&a…

什么是索引优化?如何确定何时添加或删除索引?如何监控MySQL的性能?

什么是索引优化&#xff1f;如何确定何时添加或删除索引&#xff1f; 索引优化是数据库性能调优的一个重要环节&#xff0c;它涉及到对数据库索引的创建、修改和删除等操作&#xff0c;以提高数据库查询性能和数据访问效率。索引优化主要包括选择合适的索引类型、索引列、索引顺…

DataGrip 2023:让数据库开发变得更简单、更高效 mac/win版

JetBrains DataGrip 2023是一款功能强大的数据库IDE&#xff0c;专为数据库开发和管理而设计。通过DataGrip&#xff0c;您可以连接到各种关系型数据库管理系统(RDBMS)&#xff0c;并使用其提供的一组工具来查询、管理、编辑和开发数据库。 DataGrip 2023 软件获取 DataGrip …

[unity]lua热更新——个人复习笔记【侵删/有不足之处欢迎斧正】

一、AssetBundle AB包是特定于平台的资产压缩包&#xff0c;类似于压缩文件 相对于RESOURCES下的资源&#xff0c;AB包更加灵活轻量化&#xff0c;用于减小包体大小和热更新 可以在unity2019环境中直接下载Asset Bundle Browser 可以在其中设置关联 AB包生成的文件 AB包文件…