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

【JVM】并发可达性分析-三色标记算法

欢迎访问👋zjyun.cc

可达性分析

为了验证堆中的对象是否为可回收对象(Garbage)标记上的对象,即是存活的对象,不会被垃圾回收器回收,没有标记的对象会被垃圾回收器回收,在标记的过程中需要stop the world (STW)。
缺点:当堆中的对象很多、很复杂时,用。等待时间会很长。

什么是并发可达性分析

并发的意思是指和用户的线程进行并行运行,在运行时不需要进行STW。

三色算法理论-引入三种颜色

白色:尚未访问过。
黑色:本对象已访问过,而且本对象 引用到 的其他对象 也全部访问过了。
灰色:本对象已访问过,但是本对象 引用到 的其他对象 尚未全部访问完。全部访问后,会转换为黑色。
file
file

三色算法理论-解释多标-浮动垃圾问题

file
浮动垃圾(Floating Garbage):
如图,在本图中A为GC ROOT,扫描到了B节点的时刻,断开了A到B 的应用:A.referenceB=null ,此时B下的100个下游对象,都无法被扫描到,导致无法被回收,这部分本应该回收但是没有回收到的内存,被称之为“浮动垃圾”。浮动垃圾并不会影响应用程序的正确性,只是需要等到下一轮垃圾回收中才被清除。

三色算法理论-解释漏标-对象消失问题

file
【描述】:
当扫描到B节点时,断开时了B->C 的链接,A->C 新增一条新的引用:

c=b.reference;
b.referenceC=null;
a.referencec=c;

问题!!!】
由于将B到C 的引用断开,导致C的状态还是白色,虽然新增了A到C的引用,但是A已经是黑色,不会重新进行扫描,我因此,会出现当本次扫描完成后,C还是白色,C和C引用的100个对象被回收掉了!!这是完全不能忍受的。

【出现问题的两个条件】

  • 赋值器插入了一条或者多条从黑色对象到白色对象的新引用;
  • 赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。
    要解决对象消失的问题,就要使引发问题的根源条件处理,这就引出了2种解决对象消失问题的方式,增量更新或原始快照。

如何解决漏标-增量更新(Incremental Update)

代表回收器:CMS
增量更新破坏的是第一个条件,当黑色对象插入新的指向白色对象的引用时,就将这个新加入的引用记录下来,待并发标记完成后,重新对这种新增的引用记录进行扫描;
简记:黑色对象一旦插入新的白色对象,黑色就变成灰色(需要重新扫描)
file

如何解决漏标-原始快照(Snapshot At The Beginning,SATB)

代表回收器:G1、Shenandoah
原始快照破坏的是第二个条件,当灰色对象要删除指向白色对象的引用关系时,也是将这个记录下来,并发标记完成后,对该记录进行重新扫描。
简记:如果灰色对象下的所有白色节点之间的引用删掉,那么灰色节点将变为根节点,重新进行扫描
file
【复杂度分析】

优缺点分析

增量更新:黑色对象新增一条指向白色对象的引用,那么要进行深入扫描白色对象及它的引用对象。
原始快照:灰色对象删除了一条指向白色对象的引用,实际上就产生了浮动垃圾,好处是不需要像 CMS 那样 remark,再走一遍 root trace 这种相当耗时的流程。

SATB相对增量更新效率会高(当然SATB可能造成更多的浮动垃圾),因为不需要在重新标记阶段再次深度扫描被删除引用对象,而CMS对增量引用的根对象会做深度扫描,G1因为很多对象都位于不同的region,CMS就一块老年代区域,重新深度扫描对象的话G1的代价会比CMS高,所以G1选择SATB不深度扫描对象,只是简单标记,等到下一轮GC再深度扫描。

http://www.lryc.cn/news/182126.html

相关文章:

  • 黑豹程序员-架构师学习路线图-百科:Git/Gitee(版本控制)
  • 《Jetpack Compose从入门到实战》第一章 全新的 Android UI 框架
  • 基于Spring Boot的中小型医院网站的设计与实现
  • uniapp iOS离线打包——如何创建App并提交版本审核?
  • 论文笔记:Contrastive Trajectory Similarity Learning withDual-Feature Attention
  • 整数和字符串比较的坑
  • LeetCode 面试题 08.04. 幂集
  • 【m_listCtrl !=NULL有多个运算符与操作数匹配】2023/9/21 上午11:03:44
  • Logrus 集成 color 库实现自定义日志颜色输出字符原理
  • 【Java-LangChain:使用 ChatGPT API 搭建系统-2】语言模型,提问范式与 Token
  • 想要精通算法和SQL的成长之路 - 最长连续序列
  • UG NX二次开发(C#)- 制图(Draft)-工程图框选制图曲线并输出制图曲线的信息
  • 1.7.C++项目:仿muduo库实现并发服务器之Poller模块的设计
  • Flutter笔记:build方法、构建上下文BuildContext解析
  • composer 安装和基本使用
  • Ubuntu配置深度学习环境(TensorFlow和PyTorch)
  • 【产品经理】国内企业服务SAAS平台的生存与发展
  • 【vue 首屏加载优化】
  • docker--redis容器部署及与SpringBoot整合-I
  • 力扣 -- 518. 零钱兑换 II(完全背包问题)
  • 一文搞懂UART通信协议
  • 【算法|动态规划No.7】leetcode300. 最长递增子序列
  • LeetCode 54 螺旋矩阵
  • OpenCV 概念、整体架构、各模块主要功能
  • 组合数与莫队——组合数前缀和
  • stm32之雨滴传感器使用记录
  • 华硕平板k013me176cx线刷方法
  • C#停车场管理系统
  • C++:stl:stack、queue、priority_queue介绍及模拟实现和容量适配器deque介绍
  • ​【Java】面向对象程序设计 课程笔记 面向对象基础