JVM:并发的可达性分析

这篇具有很好参考价值的文章主要介绍了JVM:并发的可达性分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象是否存活的,可达性分析算法理论上要求全过程都基于一个能保障一致性的快照中才能够进行分析,这意味着必须全程冻结用户线程的运行。

  • 在根节点枚举这个步骤中,由于 GC Roots 相比起整个 Java 堆中全部的对象毕竟还算是极少数,且在各种优化技巧(如 OopMap)的加持下,它带来的停顿已经是非常短暂且相对固定(不随堆容量而增长) 的了。
  • 可从 GC Roots 再继续往下遍历对象图,这一步骤的停顿时间就必定会与 Java 堆容量直接成正比例关系了:堆越大,存储的对象越多,对象图结构越复杂,要标记更多对象而产生的停顿时间自然就更长。

要知道包含 “标记” 阶段是所有追踪式垃圾收集算法的共同特征,如果这个阶段会随着堆变大而等比例增加停顿时间,其影响就会波及几乎所有的垃圾收集器,同理可知,如果能够削减这部分停顿时间的话,那收益也将会是系统性的。

想解决或者降低用户线程的停顿,就要先搞清楚为什么必须在一个能保障一致性的快照上才能进行对象图的遍历?为了能解释清楚这个问题,我们引入三色标记(Tri-color Marking)作为工具来辅助推导,把遍历对象图过程中遇到的对象,按照 “是否访问过” 这个条件标记成以下三种颜色:

  • 白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达。
  • 黑色:表示对象已经被垃圾收集器访问过,且这个对象的所有引用都已经扫描过。黑色的对象代表已经扫描过,它是安全存活的,如果有其他对象引用指向了黑色对象,无须重新扫描一遍。黑色对象不可能直接(不经过灰色对象) 指向某个白色对象。
  • 灰色:表示对象已经被垃圾收集器访问过,但这个对象上至少存在一个引用还没有被扫描过。

关于可达性分析的扫描过程,可以发挥一下想象力,把它看作对象图上一股以灰色为波峰的波纹从黑向白推进的过程。如果用户线程此时是冻结的,只有收集器线程在工作,那不会有任何问题。但如果用户线程与收集器是并发工作呢?收集器在对象图上标记颜色,同时用户线程在修改引用关系(即修改对象图的结构),这样可能出现两种后果。

  • 一种是把原本消亡的对象错误标记为存活(即原本应该是白色的对象被误标为黑色),这不是好事,但其实这种情况是可以容忍的,只不过产生了一点逃过本次收集的浮动垃圾而已,下次收集清理掉就好。
  • 另一种是把原本存活的对象错误标记为已消亡(即原本应该是黑色的对象被误标为白色),这就是非常致命的后果了,程序肯定会因此发生错误,下图演示了这样的致命错误具体是如何产生的。

JVM:并发的可达性分析

Wilson 于 1994 年在理论上证明了,当且仅当以下两个条件同时满足时,会产生 “对象消失” 的问题,即原本应该是黑色的对象被误标为白色:

  • 赋值器插入了一条或多条从黑色对象到白色对象的新引用;
  • 赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。

因此,我们要解决并发扫描时的对象消失问题,只需破坏这两个条件的任意一个即可。由此分别产生了两种解决方案:增量更新(Incremental Update)和原始快照(Snapshot At The Beginning,SATB)。

  • 增量更新要破坏的是第一个条件,当要插入黑色对象指向白色对象的引用关系时,就将这个新插入的引用记录下来, 等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。这可以简化理解为,黑色对象一旦新插入了指向白色对象的引用之后,它就变回灰色对象了。
  • 原始快照要破坏的是第二个条件,当要删除灰色对象指向白色对象的引用关系时,就将这个要删除的引用记录下来, 等并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次。这可以简化理解为,无论引用关系删除与否,都会按照刚刚开始扫描那一刻的对象图快照来进行搜索。

以上无论是对引用关系记录的插入还是删除,虚拟机的记录操作都是通过写屏障实现的。

在 HotSpot 虚拟机中,增量更新和原始快照这两种解决方案都有实际应用,譬如,CMS 是基于增量更新来做并发标记的,G1、Shenandoah 则是用原始快照来实现。

参考资料

《深入理解Java虚拟机》第 3 章:垃圾收集器与内存分配策略 3.4.6 并发的可达性分析文章来源地址https://www.toymoban.com/news/detail-410482.html

到了这里,关于JVM:并发的可达性分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 可达性分析、三色标记、新生代、老年代的关系是什么

            jvm提供了垃圾回收器进行垃圾回收,垃圾回收器的职责就是回收内存中不再被引用的对象,以便释放内存。垃圾回收器利用可达性分析算法去分析哪些对象需要被回收,可达性分析算法是这样的:首先一些对象被定义为gc roots,然后沿着这些gc roots对象的引用链往下查

    2024年02月14日
    浏览(29)
  • 基于高斯两步移动搜寻法(2SFCA)的城市绿地可达性分析

    【2SFCA的基本思路,可以略过】 对每个供给点j,搜索所有在j搜寻半径(d0)范围内的需求点(k),计算供需比Rj;对每个需求点i,搜索所有在i搜寻半径(d0)范围内的供给点(j),将所有的供需比Rj加总得到i点的可达性Ai。 【数据】 成都市城区绿地数据、各街道小区数据、

    2023年04月21日
    浏览(29)
  • 邻接矩阵、可达性矩阵、完全关联矩阵、可达性矩阵的计算

    邻接矩阵:很简单,就是两个点有关系就是1,没有关系就是0 可达性矩阵:非常简单,两点之间有路为1,没有路为0 可发行矩阵的计算 :有n个元素,初始可达性矩阵为A,那么最终的矩阵 B= 完全关联矩阵:描述点与边的关系,如果该点和该边有关系为1,没有关系就为0,非常

    2024年01月25日
    浏览(27)
  • 【数据库+Engine】吉大核酸采样点空间分布与可达性分析系统集采样管理一键式平台报告

    无法直接粘贴图片 报告,源程序,介绍视频下载链接如下: https://download.csdn.net/download/qq_54263076/87354460 每一张表所对应的角色的领域范围和空间如下: 第一子集.核酸总流程表:单号ID,待检员ID,取样员ID,取样时间,取样地点,核酸试剂编号ID 第二子集.人员表:人员ID,姓

    2023年04月20日
    浏览(34)
  • 图论可达性c语言实现

           图论中的可达性是指在图中是否存在从一个顶点到另一个顶点的路径。这是图论中的一个基本概念,对于许多实际问题的建模和解决都非常重要。以下是关于图论可达性的一些重要概念和信息: 有向图和无向图: 图可以分为有向图和无向图。在有向图中,边有方向,

    2024年01月23日
    浏览(31)
  • 【Linux】测试ip:port端口是否连通即可达性测试

    【Linux】测试ip:port端口是否连通即可达性测试 0、背景 1、telnet可达性测试 2、curl可达性测试 3、wget可达性测试 0、背景 在视觉项目开发调试的过程中经常需要判定IPC是否可达,在做服务的时候也需要判定服务器是否可达。 本博客介绍3种常用的工具(telnet、curl、wget)进行可

    2023年04月17日
    浏览(30)
  • 离散数学 --- 图论基础 --- 图的同构,通路与回路,可达性与最短通路

    同一个图(这里的图是抽象的数学定义)可以有不同的图形表示方法 1.重数:两点之间的平行边的个数   1.得到 n! 的过程,一个图中的一个结点在另一个图中对应的结点有n种可能(黄框中定义的图来讨论),这个对应好后下一个结点有 n - 1 种可能,再下一个有n-2种,直到最

    2024年01月25日
    浏览(28)
  • 主流编程语言的“介绍”与“选择”

    编程语言本身没有优劣之分,不同的语言适合不同的场景,文中说的建议,多是站在小白要就业的立场给出的建议。 我们看这张导图,这张图右侧是前端类的语言,左侧是服务端的语言:   我们先说右侧。 我强调下他和 Java 是没有关系的,只是名字类似。 他的用途是前端开

    2024年03月09日
    浏览(74)
  • 用主流编程语言解小学题

    最近在网上刷到一个视频,内容是奶奶有60 元钱,去超市买了10元水果,收营员应该找奶奶多少钱?我一开始反应就是50元,后来想了想题干里没有说明这60元是怎么构成的,有可能是一张50元和一张10元,或者是3张20元等等可能。所以想要知道所有可能可以运用我们所学的编程

    2024年02月16日
    浏览(34)
  • 编程语言如何推动DeFi成为主流?

    随着DeFi的快速增长,提供DeFi服务的平台和产品也如雨后春笋般纷纷冒头。作为衡量DeFi协议管理资金规模的标准之一,DeFi“总锁仓量”在过去两年一路从100亿美元增长到超400亿美元,期间更是一度冲上1800亿美元的巅峰。但直到今天,智能合约编程语言功能并没有足够完善到

    2024年02月01日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包