专栏首页洁癖是一只狗并发的可达性分析

并发的可达性分析

我们知道JVM是利用可达性分析算法来判断对象是否存活,可达性分析算法理论上要求全过程基于一个能保障一致性的快照中进行分析,这意味着必须冻结用户线程的运行。

又由于GC Roots相比这个堆中的全部对象毕竟还是少数,且在各种优化中,他带来的停顿是非常短暂的,但是从GC Roots再继续往下扫描遍历对象图,这一步骤的停顿时间和堆的容量是成正比的,因此他会随着堆的变大而产生的停顿时间更长,会影响几乎所有的垃圾收集器,因此我们要是能够消减这部分的停顿,那收益就是系统级别的。

此时如果我们想要解决或者降低用户线程的停顿,就必须知道为什么必须要保障一致性快照上才能进行对象图的遍历,因此我们引入三色标记来作为辅助来理解

  • 黑色,表示对象已经被访问过,且这个对象的所有引用都已经被扫描过
  • 白色,表示对象还没有被访问过
  • 灰色,表示对象已经被垃圾收集器扫描过,但这个对象至少存在一个引用还没有扫描过

我们看到上面图片,当我们进行可达性分析的时候,当扫描到2节点的时候,这个时候,由于用户线程的的干扰,就会变成下面图片

这里2正准备到扫描4节点的时候,用户线程对应用进行了修改,把3到4的引用删除了,添加了2到4的引用,又由于2是黑色节点已经被扫描过了,就不会重新扫描他的子节点,此时4节点还是白的,因此JVM此时就会认为4已经不可达了,就会回收这个本应该存活的对象,就会导致2对象引用4的时候报错,这个中操作非常致命的.

为什么会出现这样的问题呢,原因如下

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

上面两者共存才会导致致命的问题,单单一个条件是没有影响的,如下图,删除一个旧的引用,就不会影响

或者添加一个引用也不会影响

因此只有两个条件同时存在,才会出现问题,所以我们只要破坏掉其中一条就可以了,因此出现了两种方案.

  1. 增量更新,破坏第一条,当黑色对象插入新的指向白色对象的引用关系时候,就将这个新插入的引用记录下来,等并发扫描完之后,再将这些记录过的引用关系中的黑色为根节点重新扫描一次。
  2. 原始快照,破坏第二条,当灰色对象要删除指向白色对象的引用关系时候,就将这个要删除的引用关系记录下来,等并发扫描完之后,在将这些记录过的引用关系中的灰色对象为根节点,重新扫描一次.

我们知道cms垃圾收集器使用的就是增量更新来做并发标记的,而G1则是利用原始快照来实现的,下次我们在再分析这两个垃圾收集器,敬请期待。

本文分享自微信公众号 - 洁癖是一只狗(rookie-dog),作者:洁癖汪

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试官:你说你熟悉jvm?那你讲一下并发的可达性分析

    那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片。看到这张图片的时候我就很开心,多鲜活、多舒服的画面呀。

    why技术
  • JVM可达性分析是怎么GC的?

    可达性分析是用来判断对象是否存活,通过"GC Roots"作为起点,从这个节点往下搜索,如果有有引用,则这个对象是存活的,如果没有则判定可回收的对象。

    逍遥壮士
  • Java引用计数收集和可达性分析

    宇宙之一粟
  • JVM性能调优-对象存活算法可达性分析

    根搜索算法是从离散数学中的图论引⼊的,程序把所有的引⽤关系看作⼀张图,从⼀个节点GC ROOT开始,寻找对应的引⽤节点,找到这个节点以后,继续寻找这个节点的引⽤...

    cwl_java
  • 有向图之数据类型和可达性分析

    本篇主要讲有向图的两个方面,1、有向图的数据类型,2有向图的可达性分析。要是了解的同学欢迎讨论 。当然拉觉得无趣的也可以跳过。

    大数据和云计算技术
  • HashMap在并发下可能出现的问题分析

    大家知道HashMap内部实现是通过拉链法解决哈希冲突的,也就是通过链表的结构保存散列到同一数组位置的两个值,

    哲洛不闹
  • Linux并发(函数的可重入性)

    可重入函数是并发编程中必须要考虑的问题,否则代码就会有隐患,更糟糕的是这些隐患往往只能在特定场景下才能复现。

    用户2617681
  • RabbitMq可靠性分析

    最近了解并简单实用了下Rabbitmq,整个使用也大致了解了,但是要作做到真正的可靠,仅仅依赖于应用提供的方式是否在业务环境中真的能够达到可靠的目的。当然我们所...

    sucl
  • Eureka可用性分析

    List<ServiceInstance> list = discoveryClient.getInstances("zhao-service-resume")...

    zhaozhen
  • Java 并发篇03 -序性、可见性、原子性。

    这篇文章,我们将给大家来讲解引起我们并发问题的三大因素--— 有序性、可见性、原子性。这三个问题是属于并发领域的所以并不涉及语言。

    haoming1100
  • java并发之原子性、可见性、有序性

    原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

    王念博客
  • 保守性分析并作图

    基因组的保守性常常与功能有关,保守性强的序列可能在细胞的发育和调控等方面发挥着至关重要的作用。

    生信编程日常
  • Java并发编程与高并发之线程安全性(原子性、可见性、有序性)

    1、并发的基本概念:同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时存在的,每个线程都处于执行过程中的某个...

    别先生
  • Java并发-推荐使用不可变对象的原因分析

    在Java语法中,String即是不可变对象,一旦创建,假设你若想修改String对象值,只能重新创建String对象。 实现方式如下:1.将内部char类型...

    Fisherman渔夫
  • Java并发编程(一)---原子性,可见性,有序性

    并发编程世界里,由于CPU缓存导致的可见性问题,线程切换导致的原子性问题,以及编译器重排序导致的有序性问题是并发编程Bug的根源。

    码农飞哥
  • Java并发编程之验证volatile的可见性

    通过系列文章的学习,凯哥已经介绍了volatile的三大特性。1:保证可见性 2:不保证原子性 3:保证顺序。那么怎么来验证可见性呢?本文凯哥将通过代码演示来证...

    凯哥Java
  • Java并发之Condition的实现分析

    回忆 synchronized 关键字,它配合 Object 的 wait()、notify() 系列方法可以实现等待/通知模式。

    美的让人心动
  • xcbuild可用性分析报告

    xcbuild是Facebook 出品的开源 App 构建工具,一款能够为 App 构建过程与多平台运行提供更快构建、更好文档并兼容 Xcode 的构建工具。

    nimomeng
  • Eureka可用性源码分析

    在调用时通过断点可以知道具体的元数据。在实际使用过程中,我们可以针对配置的不同元数据采取不同的执行

    zhaozhen

扫码关注云+社区

领取腾讯云代金券