CMS 清理流程

三色标记

概述

三色标记其实就是用三种颜色区分不同的内存区域。

  • 黑色标记:自己已经标记,直接引用的对象区域已经标记
  • 灰色标记:自己标记完成,但引用区域没来得及标记
  • 白色标记:没有遍历到的区域,可以理解为没有标记
    CMS在每次进行标记的时候。从根root广度优先遍历。第一次遍历根root最终被标记为黑色,且引用对象标记为灰色。
    再次遍历时黑色区域引用区域也已经标记,则不会再次扫描标记,灰色区域需要进行扫描并最终标记为黑色区域。白色区域<未标记>的认为是垃圾,进行清理。

可能存在的问题已经解决

假设
A:一个黑色区域
B:一个灰色区域
C:一个白色区域<未被扫描>

浮动垃圾问题

概述

原本A引用B,但在A标记为黑色后,A对B的引用断开,没有指向B的引用后,B应该为白色区域,但已经标记灰色区域。这种情况,B第一次垃圾回收不会被回收,这种情况称为浮动垃圾
但是浮动垃圾并不会有实质性的影响,因为下次垃圾回收会重新标记,则会被回收。

漏标问题

概述

原本A引用B,B引用C,在A被标记为黑色后,A建立了指向C的引用,且B指向C的引用断开。此时A已经被标记为黑色,则不会再便利A的引用,且B对C的引用已经断开。这样会造成C未被标记,被垃圾回收,造成空指针问题。

解决方法:

CMS解决方式:
当发生A引用C<黑色对象指向了白色对象>的情况。此时将A标记为灰色。并且在全部标记结束后,会有一个remark阶段,必须从头扫描一遍。发生在重新标记阶段,所以在这个阶段必须STW。

G1解决方式 :
当发生B指向C的引用<指针>断开的时候。将这个引用<指针>记录在一个特定区域。垃圾回收线程在扫描的时候会查看这个区域的增量数据。发现有增量数据。会看C此时还有没有对象指向他,如果有则将区域C标记为灰色。否则不标记<视为可回收垃圾>。

CMS 中 三色标记概述相关推荐

  1. CMS与三色标记算法

    文章目录 CMS收集器 CMS的缺点 三色标记算法 漏标 错标 原始快照和增量更新 写屏障 尾巴 CMS(Concurrent Mark Sweep)是一款里程碑式的垃圾收集器,为什么这么说呢?因为在 ...

  2. 说说关于JVM三色标记算法

    本文来说下关于JVM三色标记算法 文章目录 概述 三色标记算法思想 算法流程 三色标记存在问题 解决办法 CMS回顾 CMS解决办法:增量更新 CMS另两个致命缺陷 G1回顾 G1前置知识 Card ...

  3. JVM 三色标记 增量更新 原始快照

    2.1 基本算法 要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象: 最终结果:A/D/E/F/G 可达 我们把遍历对象图过程中遇到的对象,按"是否访问 ...

  4. JVM从入门到精通(十):垃圾回收算法串讲:CMS,G1,三色标记算法

    CMS 并发回收,工作线程和GC线程同时进行,暂停时间短 老年代 分为 四个阶段: 初始标记:需要STW,因为初始的垃圾并不多,因此耗费的时间不长 并发标记:垃圾回收线程和工作线程同时执行.一边产生垃 ...

  5. JVM 的三色标记算法详解

    本文来说下关于JVM 的三色标记算法. 文章目录 三色标记算法概述 引用计数&可达性分析 分代收集 什么是卡表 卡表的问题 写屏障 伪共享 三色标记算法 基本算法 三色标记算法缺陷 多标 漏标 ...

  6. 你对JVM三色标记的理解嘛?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 三色标记法是一种 ...

  7. JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?

    文章目录 前言 一.如何判断一个对象是否为垃圾? 1.1.reference count(引用计数) 1.2.reference count(引用计数)存在的问题 二.Root Searching(根 ...

  8. 三色标记原理,我给应聘者问懵了...

    本文分享自华为云社区<从三色标记说开去>,原文作者:java初中生. [1]关于三色标记 前几天,公司临时派我去面试一个java实习生,由于没有这方面的任何经验,于是一不小心,我就问超纲了 ...

  9. 三色标记(可达性分析算法)及一些思考

    三色标记算法及一些思考 三色标记算法 并发下导致的问题 解决方式 最近,在阅读<深入理解Java虚拟机>一书关于可达性分析内容的描述后,有些感悟,故写下此文章. 首先,我们假设根节点已经枚 ...

最新文章

  1. batchsize设置为2的n次方_试卷中的页码设置
  2. GDCM:读取显式长度SQIVR的测试程序
  3. 树和二叉树的基本概念(二级)
  4. nginx日志中添加请求的response日志
  5. C# 11 中的参数 null 检查
  6. java 生成xml乱码_jdom解决中文乱码问题 JAVA生成xml文件帮了我很大的忙
  7. 北交大计算机学院复试经验,2014考研复试:过来人考研复试经验谈-北交大计算机系...
  8. mysql数据库导出导入设置编码
  9. 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.9
  10. Linux 如何将eth1网卡修改为eth0
  11. Axure中将不同文件页面合在同一个页面中
  12. 三星笔记文件存储路径_《那些年JavaWeb踩过的坑》ssh框架整合配置文件路径(错误笔记)...
  13. php 图片上传打印路径,php上传图片到指定位置路径保存到数据库的具体实现
  14. js各种for循环及性能比较
  15. ES的索引(倒排索引),文档,查询
  16. 计算机文件只读模式,电脑文件只读模式如何修改 – 手机爱问
  17. 一些基于 D3.js 的图表库
  18. 2019年BET公司面试题目大汇总
  19. win7系统没有计算机睡眠状态,win7旗舰版系统休眠模式和睡眠模式的区别
  20. 你知道CAD软件将圆弧与直线转换成多段线的方法吗?

热门文章

  1. htcvive 经常黑屏 steamvr 提示 dhcp err
  2. DMRS for PDCCH
  3. 5G 核心网 PDU Session Release 信令流程
  4. linux 一次io大小,Linux——标准IO篇
  5. img中src引入svg,修改svg颜色
  6. Gen8 ESXi 6.5 硬盘RDM 直通
  7. 多线程-模拟短信群发
  8. SPI协议及其工作原理详解
  9. 【顺序结构】:三位数倒叙问题(题解)
  10. AngulaerJs