当前位置: 首页 > news >正文

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.lryc.cn/news/165985.html

相关文章:

  • 使用 CSS 伪类的attr() 展示 tooltip
  • 在命令窗口便捷快速复制输出结果到剪贴板
  • CUDA小白 - NPP(8) 图像处理 Morphological Operations
  • java获取音频,文本准转语音时长
  • 基于串口通讯的多电机控制技术研究
  • 【深入解读Redis系列】(五)Redis中String的认知误区,详解String数据类型
  • 段指导-示例
  • LeetCode 面试题 04.02. 最小高度树
  • 华为云云耀云服务器L实例评测|初始化centos镜像到安装nginx部署前端vue、react项目
  • python项目制作docker镜像,加装引用模块,部署运行!
  • Redis缓存设计与性能优化
  • 免杀对抗-Python-混淆算法+反序列化-打包生成器-Pyinstall
  • C#__线程池的简单介绍和使用
  • 安全员(岗位职责)
  • unity 使用声网(Agora)实现语音通话
  • vue2.X 中使用 echarts5.4.0实现项目进度甘特图
  • 《PostgreSQL与NoSQL:合作与竞争的关系》
  • 【FAQ】视频监控管理平台/视频汇聚平台EasyCVR安全检查相关问题及解决方法3.0
  • Java 8 新特性解读及应用实践
  • C++项目实战——基于多设计模式下的同步异步日志系统-④-日志系统框架设计
  • 计算机专业毕业设计项目推荐02-个人医疗系统(Java+原生Js+Mysql)
  • Nginx__高级进阶篇之LNMP动态网站环境部署
  • Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来
  • NXP iMX8MM 修改 UART4至 Cortex-A53 核心
  • C#控制台程序中使用log4.net来输出日志
  • 用GPT干的18件事,能够真正提高学习生产力,建议收藏
  • 线性代数的本质(二)——线性变换与矩阵
  • JavaScript获取字符串的字节长度
  • [2023.09.13]: Rust Lang,避不开的所有权问题
  • Redux中间件源码解析与实现