CMS 三色标记【JVM调优】

文章目录

    • 1. 垃圾回收器
    • 2. CMS 原理
    • 3. 三色标记算法

1. 垃圾回收器

① Serial:最原始的垃圾回收器,用于新生代,是单线程的,GC 时需要停止其它所有的工作,算法简单,但它只能在内存较小时勉强使用;
② Serial Old:跟 Serial 配合使用,用于老年代,也是单线程;
③ Parallel Scavenge:属于并行多线程,用于新生代,多个 GC 线程一起工作,但是业务线程必须停着;
④ Parallel Old:跟 Parallel Scavenge 一起使用,用于老年代,并行多线程;
⑤ CMS:真正意义上的并发收集器,GC 线程与业务线程并发执行,老年代;
⑥ Parnew:本质上是 Parallel Scavenge 的改进版,专门用来配合 CMS 使用,新生代。

2. CMS 原理

① 初始标记

初始标记找到根上的对象,属于 STW。

在 STW(Stop-The-World)状态下,除了 GC 线程外,其他业务线程都将停止工作!

② 并发标记

业务线程继续执行,GC 线程独立开始工作。

③ 重新标记
针对并发标记所产生的错标问题,我们需要对它进行修正,这个修正过程叫做重新标记,也属于 STW。

④ 并发清理

清理掉需要回收的垃圾。

3. 三色标记算法

在这里插入图片描述
三色标记算法用在并发标记阶段,标记清除中的标记过程用的就是三色标记。当能扫描到的对象都变成黑色的时候,就代表扫描完了,其余扫描不到的对象都是垃圾!

黑色自己被标记,孩子也被标记,下次 GC 时自己和孩子都不会再扫描。

灰色:灰色是黑色的孩子,灰色自己被标记了,但是它的孩子还没有被标记,下次 GC 时不扫自己扫孩子

白色:白色是没有遍历到的节点,自己都没有被标记到

由于业务线程和 GC 线程都在不间断地运行,这势必会出现一些不可预测的问题:
① B → D 消失的情况,这种情况不算严重。当经历了一次 GC 扫描之后,扫描完了 A 和 B,还没来得及扫描白色对象 D 的时候,B 指向 D 的引用突然消失了,就会导致 D 成为浮动垃圾,下一次扫描的时候会直接被当成垃圾扫描出来;
② B → D 消失,但是 A → D 增加,这是最严重的的一种情况。A、B 扫描完,但是还没来得及扫描到 C,业务代码就开始运行,B 指向 D 的引用突然消失了,与此同时,A 指向 D 的引用增加了。因为 A 是黑色对象,当第二次 GC 的时候,它以及它的孩子 D 都不会被扫描到,而 B 到 D 也没有任何引用,这就导致 D 对象并没有被扫描到,它自然就被当成了一个垃圾。解决办法就是修改黑色对象 A 为灰色,这样下一次扫描的时候就会扫描到它的孩子 D 了。这种解决方案叫做 Incremental Update,但是这种方案也有漏标的可能性,所以最终 CMS 还得进行一次重新标记才可以,重新标记的过程是 STW,阻止业务线程运行,牺牲运行效率换取标记无误。

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

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

相关文章

【Maven教程】(五)仓库:解析Maven仓库—布局、分类和配置,远程仓库的认证与部署,快照版本,依赖解析机制,镜像和搜索服务 ~

Maven 仓库 1️⃣ 什么是Maven仓库2️⃣ 仓库的布局3️⃣ 仓库的分类3.1 本地仓库3.2 远程仓库3.3 中央仓库3.4 私服 4️⃣ 远程仓库的配置4.1 远程仓库的认证4.2 部署至远程仓库 5️⃣ 快照版本6️⃣ 从仓库解析依赖的机制7️⃣ 镜像8️⃣ 仓库搜索服务8.1 Sonatype Nexus8.2…

智能小车之跟随小车、避障小车原理和代码

目录 1. 红外壁障模块分析​编辑 2. 跟随小车的原理 3. 跟随小车开发和调试代码 4. 超声波模块介绍 5. 摇头测距小车开发和调试代码 1. 红外壁障模块分析 原理和循迹是一样的,循迹红外观朝下,跟随朝前 TCRT5000传感器的红外发射二极管不断发射红外…

2023 年高教社杯全国大学生数学建模竞赛-E 题 黄河水沙监测数据分析详解+思路+Python代码

2023 年高教社杯全国大学生数学建模竞赛-E 题 黄河水沙监测数据分析 十分激动啊啊啊题目终于出来了!!官网6点就进去了结果直接卡死现在才拿到题目,我是打算A-E题全部做一遍。简单介绍一下我自己:博主专注建模四年,参与…

golang-bufio 缓冲写

1. 缓冲写 在阅读这篇博客之前,请先阅读上一篇:golang-bufio 缓冲读 // buffered output// Writer implements buffering for an io.Writer object. // If an error occurs writing to a Writer, no more data will be // accepted and all subsequent…

《protobuf》入门

protobuf 初始protobuf简单上手编写protobuf编译 .proto 文件编写测试文件 testPB.cc 初始protobuf Protocol Buffers 是 Google 的一种语言无关、平台无关、可扩展的序列化结构数据的 方法,它可用于(数据) 通信协议、数据存储等。 Protocol …

【autodesk】浏览器中渲染rvt模型

使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中,有一个名为"Model Derivative"的服务,它可以将包括RVT(Revit)在内的多种BIM&#xff08…

【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码

【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码 1 题目 题目 D 题 圈养湖羊的空间利用率 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养,适应不同种类、不同阶段的牲畜对空间的不同要求,以保障牲畜安全和健康&a…

lambda表达式介绍

前言 lambda表达式是C11标准才支持的,有了它以后在一些地方进行使用会方便很多,尤其在一些需要仿函数的地方,lambda表达式完全可以替代它的功能。代码的可读性也会提高。 目录 1.lambda表达式 2.lambda表达式语法 3.函数对象和lambda表达…

【MySQL】MySQL的安装,登录,配置和相关命令

文章目录 前言一. 卸载不需要的环境二. 获取MySQL的yum源三. 安装MySQL和启动四. 尝试登录MySQL方法1:获取临时root密码方法2:没有密码方法3:配置文件 五. 简单配置结束语 前言 本篇文章是基于云服务器;Linux:Centos7…

在 Windows 上远程对 Linux 进行抓包

文章目录 名词解释事先准备下载安装 Wireshark下载运行 libpcap设置 libpcap 环境变量在 Wireshark 中远程连接 libpcap 笔者的运行环境:(成功) 本地客户端: Windows: Windows 10 教育版(本文) …

【文末送书】全栈开发流程——后端连接数据源(二)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【python手写算法】逻辑回归实现分类(含公式推导)

公式推导: 代码实现: # codingutf-8 import matplotlib.pyplot as plt import numpy as npdef f(w1,x1,w2,x2,b):zw1*x1w2*x2breturn 1/(1np.exp(-z)) if __name__ __main__:X1 [12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,2.1…

swiper删除虚拟slide问题

在存在缓存的情况下,删除较前的slide,会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide,且这5个slide已缓存,则删除slide2后,仍为5个slide,且slide2的内容变为slide3的内容,此…

JAVA设计模式第十讲:SPI - 业务差异解决方案

JAVA设计模式第十讲:SPI - 业务差异解决方案 我们需要在不修改源代码的情况下,动态为程序提供一系列额外的特性。首先想到的是Spring的AOP技术来构建应用插件,但是在Java自带的插件中,就有完整的实现。SPI(Service Pro…

23062C++QT day2

封装一个结构体,结构体中包含一个私有数组,用来存放学生的成绩,包含一个私有变量,用来记录学生个数, 提供一个公有成员函数,void setNum(int num)用于设置学生个数 提供一个公有成员函数:void…

Vue3实战06-CompositionAPI+<script setup>好在哪?

Vue 3 的Composition API <script setup>这种最新的代码组织方式。

天翼云不做备案接入,如何绑定域名,不用80端口,443端口。

443&#xff0c;80端口不开启。 第一步&#xff1a; 宝塔更改web端口 搞个复杂的端口。 第二步&#xff1a; 在天翼云策略组上面开启修改过的web端口。 第三步&#xff1a;接入cdn&#xff0c;端口改成修改过的端口。

关于MyBatisPlus框架下出现xml里面定义的方法无法被正确识别以及提示调用mysql存储过程时参数无效的问题

第一个问题&#xff1a;xml里面明明定义了方法A&#xff0c;但是通过IService接口调用A的时候&#xff0c;总提示无法将接口中定义的函数绑定到xml中的同名方法中&#xff08;“Invalid bound statement (not found): com.aircas.sqlservice.mapper.SysTempIndexMapper.getRemo…

3D封装技术发展

长期以来&#xff0c;芯片制程微缩技术一直驱动着摩尔定律的延续。从1987年的1um制程到2015年的14nm制程&#xff0c;芯片制程迭代速度一直遵循摩尔定律的规律&#xff0c;即芯片上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。但2015年以后&#xff0c;芯片制…

H.264视频编码推荐的分辨率和码率配置表

Video Encoding Settings for H.264 Excellence 针对H.264编码格式&#xff0c;根据不同分辨率&#xff0c;推荐其对应的码率配置关系如下图所示&#xff1a; 如下为上限&#xff0c;超过这个上限再增加码率基本无太大意义&#xff01;根据业务场景、帧率&#xff0c;建议码率…