CMS 三色标记【JVM调优】

news2024/12/24 3:06:06

文章目录

    • 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.coloradmin.cn/o/982534.html

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

相关文章

光栅和矢量图像处理:Graphics Mill 11.4.1 Crack

Graphics Mill 是适用于 .NET 和 ASP.NET 开发人员的最强大的成像工具集。它允许用户轻松向 .NET 应用程序添加复杂的光栅和矢量图像处理功能。 光栅图形 加载和保存 JPEG、PNG 和另外 8 种图像格式 调整大小、裁剪、自动修复、色度键和 30 多种其他图像操作 可处理任何尺寸&am…

C语言深入理解指针(非常详细)(四)

目录 字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化 二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字 函数指针数组转移表 字符指针变量 字符指针在之前我们有提到过,(字符)&am…

ABB MPRC086444-005数字输入模块

ABB MPRC086444-005 是一款数字输入模块,通常用于工业自动化和控制系统中,用于接收和处理数字信号。以下是这种类型的数字输入模块通常可能具备的一般功能和特点: 数字输入接口:MPRC086444-005 模块通常配备多个数字输入通道&…

Android扫码连接WIFI实现

0&#xff0c;目标 APP中实现扫WIFI分享码自动连接WIFI功能 1&#xff0c;前提条件 设备需要有个扫码器&#xff08;摄像头拍照识别也行&#xff09;&#xff0c;APP调用扫码器读取WIFI连接分享码。 2&#xff0c;增加权限 在AndroidManifest.xml中增加权限 <uses-permissi…

PyTorch深度学习实战(14)——类激活图

PyTorch深度学习实战&#xff08;14&#xff09;——类激活图 0. 前言1. 类激活图1.1 基本概念1.2 类激活图生成 2 数据集分析3 使用 PyTorch 生成 CAM小结系列链接 0. 前言 我们已经能够构建性能优异的神经网络模型&#xff0c;但对我们而言&#xff0c;卷积神经网络的决策过…

嵌入式Linux驱动开发(LCD屏幕专题)(一)

一、LCD简介 总的分辨率是 yres*xres。 1.1、像素颜色的表示 以下三种方式表示颜色 1.2、如何将颜色数据发送给屏幕 每个屏幕都有一个内存&#xff08;framebuffer&#xff09;如下图&#xff0c;内存中每块数据对用屏幕上的一个像素点&#xff0c;设置好LCD后&#xff…

西门子PLC与三菱PLC之间能否实现无线MODUBS通讯

对一个大型工厂&#xff0c;由于生产线的不断改造、新老流程的不断更新&#xff0c;这些PLC系统往往是由不同的制造商提供的。那么在智慧工厂的实现中&#xff0c;常会遇到不同品牌PLC之间需要进行相互通讯的情况。由于场地和生产能效的原因&#xff0c;在后期的系统改造中&…

提升效率:PostgreSQL准确且快速的数据对比方法

作为一款强大而广受欢迎的开源关系型数据库管理系统&#xff0c;PostgreSQL 在数据库领域拥有显著的市场份额。其出色的可扩展性、稳定性使其成为众多企业和项目的首选数据库。而在很多场景下&#xff08;开发|生产环境同步、备份恢复验证、数据迁移、数据合并等&#xff09;&a…

基于Python开发的学生信息管理系统控制台程序(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的学生信息管理系统控制台程序&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都…

《2023人工智能发展白皮书》发布(118页)

导读 本白皮书由七大部分组成。第一章人工智能产业链分析&#xff0c;描绘人工智能产业链全景图&#xff0c;并对产业链各环节进行深入分析;第二章人工智能行业环境&#xff0c;明确中国人工智能行业生命周期和竞争结构;第三章人工智能发展概况&#xff0c;阐述国内外人工智能…

4.3.3 【MySQL】Redundant行格式

现在我们把表demo 的行格式修改为 Redundant &#xff1a; 为了方便大家理解和节省篇幅&#xff0c;我们直接把表 demo 在Redundant 行格式下的两条记录的真实存储数据提供出来&#xff0c;之后我们着重分析两种行格式的不同即可。 下边我们从各个方面看一下 Redundant 行格式有…

十二、集合(4)

本章概要 集合 Set映射 Map队列 Queue 优先级队列 PriorityQueue 集合与迭代器 集合Set Set 不保存重复的元素。 如果试图将相同对象的多个实例添加到 Set 中&#xff0c;那么它会阻止这种重复行为。 Set 最常见的用途是测试归属性&#xff0c;可以很轻松地询问某个对象是否…

SQL Server 2012下载和安装配置详细教程手册

SQL Server 2012 下载和安装详细教程 目录 SQL Server 2012 下载和安装详细教程1、软件下载2、软件安装3、软件验证 1、软件下载 &#xff08;1&#xff09;官网地址 https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads &#xff08;可能不太行&#xff09; &a…

简明SQL别名指南:掌握AS实现列名更名

在 SQL 查询中&#xff0c;使用 {原始字段名} as {别名} 的语法来为查询结果的列赋予更直观的名称&#xff0c;以提高查询结果的可读性和可理解性。 以下是用到的表。 用AS更名 例如&#xff0c;查询表1的name字段&#xff0c;并将其更名为"名字"&#xff0c;同时查…

多语言开发(vant

参考&#xff1a;https://blog.csdn.net/qq_44649801/article/details/131878128?spm1001.2014.3001.5506 一、抛出字段对象A export default { } 二、引入汇总文件&#xff0c;&#xff08;主要的是 模块分割 汇总&#xff0c;对A 等的处理 export default { A&#xff0c;B,…

设计模式之桥接模式、组合模式与享元模式

目录 桥接模式 简介 优缺点 结构 实现 运用场景 组合模式 简介 优缺点 结构 实现 运用场景 享元模式 简介 优缺点 结构 实现 运用场景 桥接模式 简介 将抽象与实现分离&#xff0c;使它们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降…

【rar密码】如何修改rar压缩包密码?

rar压缩包设置了密码&#xff0c;想要修改密码&#xff0c;有方法吗&#xff1f;目前看来&#xff0c;还是没有&#xff0c;我们只输入密码将压缩包中的文件解压出来。 然后将解压出来的文件再重新压缩&#xff0c;重新设置一个密码进行压缩即可达到修改密码的目的了 想要修改密…

leetcode 925. 长按键入

2023.9.7 我的基本思路是两数组字符逐一对比&#xff0c;遇到不同的字符&#xff0c;判断一下typed与上一字符是否相同&#xff0c;不相同返回false&#xff0c;相同则继续对比。 最后要分别判断name和typed分别先遍历完时的情况。直接看代码&#xff1a; class Solution { p…

B094-人力资源项目-微服务授权Oauth2

目录 背景OAUTH2总体流程Oauth2授权码模式oauth2的三方授权流程图案例演示代码讲解-整合oauth2springsecurityjwt先创建一个用于认证的服务增加AuthorizationServerConfig 模块总结认证服务整合zuul获取令牌加入网关后的变化代码详解测试 背景 微服务架构下应用散步在不同的服…

DC电源模块对电磁干扰的影响

BOSHIDA DC电源模块对电磁干扰的影响 DC电源模块是一种常用的电源转换设备&#xff0c;可以将交流电转换成直流电&#xff0c;并通过电路电子元件对电压、电流等参数进行调整&#xff0c;以满足外部设备对电源的需求。然而&#xff0c;由于DC电源模块自身的工作特性&#xff…