• CMS 三色标记【JVM调优】


    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,阻止业务线程运行,牺牲运行效率换取标记无误。

  • 相关阅读:
    【2023集创赛】加速科技杯三等奖作品:私密性高精度刷手身份认证系统
    JIRA on K8s helm部署实战
    第一百三十九回 介绍三个BLE包
    FPGA从入门到精通(二十)SignalTapII
    vs2017编译的64位libssh2库
    mysql 8.0.34 部署问题记录
    用于智能鱼缸水温检测的高精度温度传感芯片
    论文阅读《2022ICLR:Are Message Passing Neural Networks Really Helpful for Knowledge Graph Completion? 》
    领域驱动设计
    面试官:ThreadLocal使用场景有哪些?内存泄露问题如何避免?
  • 原文地址:https://blog.csdn.net/m0_52861684/article/details/132698166