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

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

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

相关文章

Git之版本回退

文章转载于:https://www.jianshu.com/p/3020740561a8 以前,如果是要去除某一块功能,我都是选择性删除,选择性注释,然后前后逻辑各种查看,各种比较。每一次,改完这些我总感觉心好累啊&#xff01…

【C#】【SAP2000】读取SAP2000中所有Frame对象的应力比到Grasshopper中

if (build true) {// 连接到正在运行的 SAP2000// 使用 System.Runtime.InteropServices.Marshal.GetActiveObject 方法获取正在运行的 SAP2000 实例cOAPI mySapObject (cOAPI)System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject"…

基于STM32的感应开关垃圾桶

1.定时器介绍 1.1 工作原理 使用精准的时基,通过硬件的方式,实现定时功能。 1.2 定时器分类 基本定时器(TIM6~TIM7)通用定时器(TIM2~TIM5)高级定时器(TIM1和TIM8) 1.3 通用定时器…

0基础使用dockerfile构建容器镜像

目录 一、使用dockerfile构建镜像 1.1、dockerfile指令 1.FROM 2.RUN 3.CMD 4.ENTRYPOINT 5.EXPOSR ​编辑 6.ADD和COPY ​编辑7.volume 8.USER 二、案例1:dockerfile构建httpd镜像 构建一个指定挂载点的httpd镜像 三、案例2:构建tomcat镜…

使用公式在Excel中指定列值的变化实现自动间隔着色(不是按照固定的行数)

如果你的文件很小,可以手工着色;但如果很大,就要借助公式来着色; 目的是什么,其中之一是:提升可读性。 一起往下看吧!! 如果你想要根据Excel某列中值的变化来间隔着色,…

Prompt Learning:人工智能的新篇章

开篇:AI的进化之旅 想象一下,你正在和一位智能助手对话,它不仅理解你的问题,还能提出引导性的问题帮助你更深入地思考。这正是prompt learning的魔力所在——它让机器学习模型变得更加智能和互动。在这篇博客中,我们将…

腾讯云轻量服务器配置nginx资源服务器

文章目录 序言:2、安装WindowsServer系统3、修改密码,启动系统4、进入系统,这里踩了一些坑5、安装Nginx6、配置nginx7、启动nginx,8、外网配置9、修改安全策略 序言: 今天项配置一个游戏资源服务器,做更新资源用&#…

uniapp 对video视频组件嵌套倍速按钮

这次接了需求是要求有倍速功能,去看了文档发现并没有倍速按钮的属性,想着手写一个吧 可最后发现原生层级太高,无论怎么样都迭不上去,就只能去找插件看看咯 找了好多插件发现都不可用,因为我这是app端,有些视…

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

原创作者:田超凡(程序员田宝宝) 版权所有,引用请注明原作者,严禁复制转载

【小沐学C#】C#文件读写方式汇总

文章目录 1、简介2、相关类介绍3、代码示例3.1 FileStream(流文件)3.2 StreamReader / StreamWriter (文本文件)3.2.1 StreamReader3.2.2 StreamWriter 3.3 BinaryReader / BinaryWriter (二进制文件)3.3.1…

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更新…

Spring Cloud项目整合Sentinel及简单使用

说明:Sentinel是阿里巴巴开发的微服务治理中间件,可用于微服之间请求的流量管控、权限控制、熔断降级等场景。本文介绍如何在Spring Cloud项目中整合Sentinel,以及Sentinel的简单使用。 环境 首先搭建一个简单的微服务环境,有以…