cms垃圾回收

news2024/10/6 16:23:56

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里了。

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

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

相关文章

Redis实现分布式锁源码分析

为什么使用分布式锁 单机环境并发时,使用synchronized或lock接口可以保证线程安全,但它们是jvm层面的锁,分布式环境并发时,100个并发的线程可能来自10个服务节点,那就是跨jvm了。 简单分布式锁实现 SETNX 格式&…

k8s关于pod

目录 1、POD 的创建流程 kubectl 发起创建 Pod 请求: API Server 接收请求并处理: 写入 Etcd 数据库: Kubelet 监听并创建 Pod: Pod 状态更新和汇报: 2、POD 的状态解析 1. Pending Pod 2. Running Pod 3. S…

【PRIVGUARD-privguard-artifact-main】代码学习(parser部分)

privguard-artifact-main:parser部分简述 1.abstract_domain.py (1)简介 实现PrivGuard中的抽象域功能。PrivGuard是一个旨在确保Python程序符合特定隐私策略的工具。代码中定义了两种类型的抽象域:闭区间格(ClosedIn…

霹雳学习笔记——6.1.2 ResNeXt

相比于ResNet,更新了block 效果:错误率低于ResNet,并且计算量一样。 对比卷积和组卷积,参数个数会变成1/g倍,g是分成了g组 最终输出的channel与卷积核的个数相同。 (好像是。。。好像之前听过这个&#xff…

【LeetCode热题100】73. 矩阵置零(矩阵)

一.题目要求 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 二.题目难度 中等 三.输入样例 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0…

文字弹性跳动CSS3代码

文字弹性跳动CSS3代码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 下载地址 文字弹性跳动CSS3代码

Rust 构建开源 Pingora 框架可以与nginx媲美

一、概述 Cloudflare 为何弃用 Nginx,选择使用 Rust 重新构建新的代理 Pingora 框架。Cloudflare 成立于2010年,是一家领先的云服务提供商,专注于内容分发网络(CDN)和分布式域名解析。它提供一系列安全和性能优化服务…

4.MAC平台Python的下载、安装(含Python2.7+Python3.12双版本环境变量配置)——《跟老吕学Python编程》

4.MAC平台Python的下载、安装(含Python2.7Python3.12双版本环境变量配置)——《跟老吕学Python编程》)——跟老吕学Python编程 一、下载MAC版Python1.Python官网2.MAC版Python下载网址 二、在MAC安装Python1.在MAC安装Python2.阅读Python重要…

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理

【Ubuntu-20.04】OpenCV-3.4.16的安装并对图片与视频处理 一、安装OpenCV-3.4.161.下载OpenCV-3.4.16安装包2.将安装包放到/home,并解压3.使用 cmake 安装 opencv4.配置环境5.查看 opencv 的版本信息 二、处理图片(一)创建文件夹 code &#…

【TB作品】MSP430,波形发生器,单片机,Proteus仿真

文章目录 题目效果梯形波100个点产生方法锯齿波100个点产生方法c代码和proteus仿真 题目 114 波形发生器的制作 设计要求 设计一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。设置5个开关K1~K5(从 上到下),分别对应正弦波、方波、三角波、梯形波、锯齿波,按一下…

Redis中缓存和数据库双写数据不一致

先更新数据库,还是先更新缓存? 1.先更新数据库,再更新缓存 2.先更新缓存,再更新数据库 1.先更新数据库,再更新缓存 举个例子,比如【请求A】和【请求B】两个请求,同时更新【同一条】数据, 则…

分布式搜索引擎elasticsearch(2)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL([Domain Specific Language](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html))来定义查…

python爬虫实战——小红书

目录 1、博主页面分析 2、在控制台预先获取所有作品页的URL 3、在 Python 中读入该文件并做准备工作 4、处理图文类型作品 5、处理视频类型作品 6、异常访问而被中断的现象 7、完整参考代码 任务:在 win 环境下,利用 Python、webdriver、JavaS…

让手机变相机,微单变全画幅的外设-斯莫格摄影套装开箱

大家好,我是Circaboy,近期给我的手机和相机入了一整套专业的摄影外设套装,然后我发现专业设备加持下的摄影着实是比我之前的要好很多,所以我就写了个文章做个简单的介绍和专业外设加持下的摄影对比。 本次入手的是斯莫格摄影套装…

Linux学习(4)——使用编辑器

1.gedit编辑器 简单易懂,依赖图形界面。可以使用ctrlc ctrlv等快捷键,ctrls进行保存,与windows系统中相类似。 2.vi/vim编辑器 vi/vim可以直接通过控制台的终端完成文本的编辑,不依赖图形界面,使用范围更广。它的编辑…

cesiumlab中shp转3dtiles白模效果一

安装cesiumlab 如果没有安装cesiumlab,去官网下载安装一个即可 http://www.cesiumlab.com/cesiumlab.html 效果 步骤 1、准备shp面数据 2、打开cesiumlab软件转换 选择shp面数据 设置高度,如果shp面中有高度字段,可以用高度字段&#xff…

ASP.NET排课实验室排课,生成班级课表实验室课表教师课表(vb.net)-214-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword214 要看成品演示 请联系客服发给您成品演示 课题:实验课排课系统 计算机 上机课 一周上5天课,周一到周五 一周上5天课,周一到周五 因为我排的是实验课,最好1&#xf…

javaweb day16 mysql

mysql 安装: 企业开发使用方法 安装虚拟机代替服务器 数据模型 创建数据库 写法 sql简介

【考研数学】打基础用张宇《30讲》还是武忠祥《基础篇》?

基础课不太可能所有的东西全都覆盖,还是先搭起一个知识框架,然后不断的填充和完善。 所以不必太过于在意少一些东西,我们不可能一口吃成胖子,基础知识肯定不会遗漏的,只可能一些技巧不到位。 从自己的情况考虑&#…

HTTP压测工具wrk安装与使用

一、前言 wrk是一个基于C语言开发的用于HTTP性能测试的开源工具,它可以模拟多个并发连接,测量服务器的响应时间和吞吐量,并且会给出较为全面的测试结果 1、本文主要内容 在Windows、macOS、Linux(CentOS & Ubuntu等&#xff…