cms垃圾回收

cms垃圾回收

  • CMS概述
  • CMS收集器整体流程
    • 初始标记
    • 并发标记
    • 重新标记
    • 并发清除
  • CMS卡表
    • 什么是卡表(card table)
    • 什么是mod-union table

CMS概述

CMS(Concurrent Mark Sweep)收集器是Java虚拟机中的一种老年代(old Generation)垃圾收集器,他主要目标是减少垃圾收集时的应用程序停顿(Stp)时间。

CMS使用并发的方式执行垃圾回收,使用的是“标记-清理”算法,尽量减少在垃圾收集过程中程序的暂停时间,适用于对服务响应速度要求较高的场景,例如互联网的B/S系统的服务端Java应用。

CMS垃圾收集器作为一款专注降低停顿时间的垃圾回收器,其主要特点是低停顿和并发:

  1. 并发
    CMS被设计为一款并发、低停顿的垃圾收集器,使得在垃圾回收过程中用户线程停顿时间很短,有助于保障系统的响应速度。
  2. 低停顿
    由于其并发特性,CMS的停顿时间相对较短,适用于对服务响应速度要求高的应用场景。

但是,由于CMS的实现机制,也存在着下面这些问题:

  1. 对CPU资源敏感:
    CMS对CPU资源敏感,因为在并发阶段虽然不会导致用户线程停顿,但会占用一部分线程(CPU资源),可能导致应用程序整体变慢,降低总吞吐量。
  2. 无法处理浮动垃圾
    由于CMS在并发清理阶段用户线程仍在运行,新的垃圾可能在标记过程之后(重新标记之后)的“并发清理阶段”产生。因为在并发清理阶段用户线程和GC线程是并发运行的,而CMS不能在当前收集中处理这部分浮动垃圾。
    所以CMS收集器必须预留一部分空间给用户用户线程使用,不能等到老年代占用100%再进行收集
  3. 对CPU数量要求较高
    CMS默认启动的回收线程数为(CPU数量+3)/4,当CPU不足4个时,可能对用户程序影响较大。
  4. 内存碎片问题
    基于“标记-清除”算法的CMS会导致大量空间碎片的产生,可能对大对象分配的时候可能会产生Full GC,因为可能出现老年代空间虽有剩余但无法找到足够大连续空间来分配当前对象。

CMS收集器整体流程

CMS垃圾收集器是一种并发执行的垃圾回收器。其执行过程分为初始标记,并发标记,重新标记,和并发清理。流程如下:

在这里插入图片描述

初始标记

初始标记只是标记GC Roots能直接关联到的对象,但需要“Stop The World”停顿,即在此期间暂停所有应用线程。这个过程在JDK 7 之前是单线程(因为GC Roots直接关联的对象相对较少),JDK 8之后是多线程的方式进行初始标记。
由于GC Root直接关联的对象小,因此可以快速的将这些对象标记出来,以减少“Stop The World”的时间。

并发标记

与应用线程一起运行,是CMS最主要的工作阶段,通过直达对象,扫描全部的对象,进行标记

重新标记

STW,修正并发标记时由于应用程序还在并发运行产生的对象的修改,多线程,速度快,需要全局停顿

由于在并发标记阶段,用户线程还是在工作的,因为有可能会产生新的对象,新对象主要通过以下三个途径产生:

  • 年轻代对象晋升到老年代,可能产生新的存活对象
  • 大对象直接被分配到老年代,可能产生新的存活对象
  • 老年代和年轻代对应的应用关系发生变化。

JVM会通过Card(卡片)的方式将发生变化的老年代区域标记为“脏”区域,也就是所谓的卡片标记(Card Marking)来对新增对象的存活状态进行重新标记。

并发清除

与应用程序一起运行,为何采用清除算法?CMS主要关注低延迟,因而采用并发方式,清理垃圾时,应用程序还在运行,如何采用压缩算法,则涉及到要移动应用程序的存活对象,此时不停顿,是很难处理的,一般需要停顿下,移动存活对象,再让应用程序继续运行,但这样停顿时间变长,延迟变大,所以CMS采用清除算法。

CMS卡表

什么是卡表(card table)

试想一下,在进行young gc时,如何判断是否存在老年代到新生代的引用?
一个简单的办法是扫描整个老年代,但是这个代价太大了,因此jvm引入了卡表来解决这个问题。

卡表又被卡片标记(card marking),其原理为,在逻辑上将老年代空间分割为若干个固定大小的连续区域,分割出来的每一个区域就称为卡片(card)。另外每个卡片又一个与其对应的标记位,最简单的实现方案是由字节数组实现,以卡的编号作为索引,每个卡的大小通常介于128-512字节之间,一般使用2的幂字节大小,例如hotspot使用512字节。

当卡片内部发生应用变化时(指针写操作),写屏障会将该卡在卡表中对应的字节标记为脏(dirty)。

有了卡表后,在YGC时,只需要将卡表中被标记为dirty的card也作为扫描范围,就可以保证整个老年代也不会有遗漏了。

什么是mod-union table

通过上面的card table介绍,我们知道card table会记录下老年代所有发生过引用变化对象所在的card,而CMS在并发标记阶段,也需要记录下老年代发生引用变化的对象以便后续重新扫描,那是否可以直接复用card table呢?

不行的。这是因为每次ygc过程中都涉及重置和重新扫描card table,这样是满足了ygc的需求,但却破坏了CMS的需求,cms需要的信息可能被ygc重置掉了。为了避免丢失信息,于是在card table之外另加家了一个bitmap,叫做mon-union table。

在cms并发标记正在运行的时候,每当发生一次ygc,当ygc重置card table里的某个记录时,就会更新mon-union table对应的bit,相当于把car table里的信息转移到了mod-union table里了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库基础知识超详细解析~‍(进阶/复习版)

文章目录 前言一、数据库的操作1.登入数据库2.创建数据库3.显示当前数据库4.使用数据库5.删除数据库 二、常用数据类型三、数据库的约束1约束类型2NULL约束3UNIQUE:唯一约束4DEFAULT:默认值约束5 PRIMARY KEY:主键约束6 FOREIGN KEY:外键约束…

STM32第十课:串口发送

一、usart串口 1.1 USART串口协议 串口通讯(Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。在计算机科学里&…

2024年云仓酒庄:店中店增项新模式,开启葡萄酒文化新篇章

2024云仓酒庄:店中店增项新模式,开启葡萄酒文化新篇章 在葡萄酒行业蓬勃发展的今天,云仓酒庄以其独特的经营模式和创新思维,在市场中脱颖而出。2024年,云仓酒庄继续深化其战略布局,不仅在多地开设酒庄实体…

【论文笔记合集】Transformers in Time Series A Survey综述总结

本文作者: slience_me 文章目录 Transformers in Time Series A Survey综述总结1 Introduction2 Transformer的组成Preliminaries of the Transformer2.1 Vanilla Transformer2.2 输入编码和位置编码 Input Encoding and Positional Encoding绝对位置编码 Absolute …

Redis到底是单线程还是多线程!,【工作感悟】

无论你是做 Python,PHP,JAVA,Go 还是 C#,Ruby 开发的,都离不开使用 Redis。 大部分程序员同学工作中都有用到 Redis,但是只限于会简单的使用,对Redis缺乏整体的认知。 无论是在大厂还是在中小…

pkav之当php懈垢windows通用上传缺陷

环境&#xff1a; Windowsnginxphp 一、php源码 <?php //U-Mail demo ... if(isset($_POST[submit])){$filename $_POST[filename];$filename preg_replace("/[^\w]/i", "", $filename);$upfile $_FILES[file][name];$upfile str_replace(;,&qu…

01-java入门了解--cmd命令、jdk、java的认识

cmd常用命令 java入门需要安装的环境 jdk。&#xff08;下载好jdk&#xff0c;并配置好环境&#xff09;idea。&#xff08;或者其他的编程工具&#xff09; jdk安装目录介绍 第一步&#xff1a;编写程序&#xff08;程序员写.java后缀的文件&#xff09; 第二步&#xff1a;…

【MMDetection3D实战(1)】:环境安装

1.介绍 MMDetection3D首次发布于2018年10月&#xff0c;是面向3D 场景中检测和分割的工具包&#xff0c;可以基于MMDetection3D实现基于点云、图像和多模态数据的3D检测与分割。github仓库地址:https://github.com/open-mmlab/mmdetection3d 目前MMDetection3D支持20多种不同的…

FastWiki v0.1.0发布!新增超多功能

FastWiki 发布 v0.1.0 https://github.com/239573049/fast-wiki/releases/tag/v0.1.0 更新日志 兼容OpenAI接口格式删除Blazor版本UI删除useEffect,解决可能存在问题的bug修复对话可以看到所有对话Merge branch ‘master’ of https://gitee.com/hejiale010426/fast-wiki更新…

【测试】1. 概念 + 基础篇

概念篇 测试相较于开发岗位而言&#xff0c;如果同学们的编程能力稍微弱一些&#xff0c;可以尝试测试方向&#xff08;更简单&#xff09; 1. 什么是软件测试 最常见的理解是&#xff1a;软件测试就是找BUG&#xff0c;发现缺陷。 早期&#xff0c;人们更多的将测试看成是对…

STM32第七节:GPIO输入——按键检测(包含带参宏)

目录 前言 STM32第七节&#xff1a;GPIO输入——按键检测&#xff08;包含带参宏&#xff09; 带参宏 代码替换展示 定义带参宏 GPIO输入——按键检测 硬件部分 端口输入数据寄存器&#xff08;GPIOx_IDR&#xff09; 编写程序 配置以及编写bsp_key文件 main函数编程…

用虚拟机安装win10超详细教程。

前言&#xff1a;安装中有任何疑问&#xff0c;可以在评论区提问&#xff0c;博主身经百战会快速解答小伙伴们的疑问 BT、迅雷下载win10镜像&#xff08;首先要下载win10的镜像&#xff09;&#xff1a;ed2k://|file|cn_windows_10_business_editions_version_1903_updated_sep…

项目中日志采集实践:技术、工具与最佳实践

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 选择合适的日志框架 二. 配置日志框架 三. 使用…

web 课程

文章目录 格式图片超链接书签链接表格例子横跨束跨 格式 <br /> <br/> #换行图片 <img> 标签是用于在网页中嵌入图像的 HTML 标签&#xff0c;它有一些属性可以用来控制图像的加载、显示和交互。以下是对 <img> 标签常用属性的详细介绍&#xff1a;…

SpringCloud Gateway 新一代网关

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第六篇&#xff0c;即介绍 Gateway 新一代网关。 二、概述 2.1 Gateway 是什么 Gateway 是在 Spring 生…

在域控的Users目录下批量创建用户组,名称来自Excel

对于CSV文件&#xff0c;PowerShell可以直接读取并处理&#xff0c;无需额外安装模块。假设你的CSV文件中&#xff0c;用户组名称在第一列&#xff0c;文件名为"groups.csv"&#xff0c;可以使用以下PowerShell脚本来批量创建&#xff1a; # 读取CSV文件中的数据 $g…

学生时期学习资源同步-1 第一学期结业考试题2

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载

【Python】科研代码学习:十 evaluate (metrics,Evaluator)

【Python】科研代码学习&#xff1a;十 evaluate Evaluate评估类型简单使用教程如何寻找想要的 metric使用 Evaluator与 transformers.trainer 配合使用疑问与下节预告 Evaluate 【HF官网-Doc-Evaluate&#xff1a;API】 看名字就可以知道&#xff0c;Evaluate 是 HF 提供的便…

中国湿地沼泽分类分布数据集

数据下载链接&#xff1a;百度云下载链接 引言 随着经济社会的快速发展和城市化进程的加速推进&#xff0c;农业发生功能性转变&#xff0c;从单一生产功能向生产、生活、生态多功能服务首都经济社会发展转变。湿地与农田、草地、森林三大生态系统整合形成完整的现代农业生态服…

Linux环境(Ubuntu)上搭建MQTT服务器(EMQX )

目录 概述 1 认识EMQX 1.1 EMQX 简介 1.2 EMQX 版本类型 2 Ubuntu搭建EMQX 平台 2.1 下载和安装 2.1.1 下载 2.1.2 安装 2.2 查看运行端口 3 运行Dashboard 管理控制台 3.1 查看Ubuntu上的防火墙 3.2 运行Dashboard 管理控制台 概述 本文主要介绍EMQX 的一些内容&a…