首页 > 编程语言 >STAB算法

STAB算法

时间:2023-04-05 11:34:37浏览次数:33  
标签:标记 对象 Top SATB 并发 算法 STAB

SATB算法思想简介

SATB算法的基本思想,可以概括为如下三句话:
  1. 并发标记之前先给Region内存打个快照,标记线程基于这个快照独立进行标记。应用线程不会直接修改这个快照中的对象,也就是说应用线程不会干扰标记线程的工作。
  2. 应用线程新分配的对象都认为是活跃对象,实际在下一个并发标记周期进行标记。
  3. 并发标记过程中已存在对象的引用关系变更在Remark阶段单独进行处理。在并发标记阶段如果有引用关系被删除,就记录下来,Remark阶段对这些引用关系被删除的重标记,这个破坏了步骤一,即灰色对象断开了白色对象引用的时候,记录下来,后面重新把这个白色对象标记成存活对象。

SATB明确将并发标记这一个大工程分成了三个模块,分别是对快照进行并发标记、对并发标记过程中新分配的对象全部标记为活跃、对并发标记过程中引用关系变更的对象单独进行处理。

 SATB算法实现

了解了SATB算法的核心思想之后,再来看看这个算法是如何实现的。G1回收器将堆内存分成一个一个Region,在Region中分配对象时,对象都是连续分配的。这里介绍两个指针:Bottom指针和Top指针,其中Bottom指针指向Region的初始位置,Top指针指向下一个对象分配的内存位置,如果有新的对象分配,就将Top指针向前移动。如下图所示:

 G1使用的SATB算法是基于内存快照的,那SATB算法具体怎么实现基于内存快照的标记呢?现在假设在标记之前Region如下:

这个时候要进行一轮完整的并发标记周期,按照上面的说法是要先给这个Region打个快照,这个快照实际上就是[Bottom, Top)现在这块内存区域。但是在并发标记周期内,因为有引用线程在分配对象,所以Top指针肯定会往前移动,所以为了将标记开始前Top这个位置记录下来,需要定义另一个指针TAMS(全称Top-At-Mart-Start)指向标记前Top这个位置,从Top-At-Mark-Start这个字面含义就可以理解是标记开始时Top指针所在位置,这样快照所代表的内存区域就是[Bottom, TAMS)这块,并发标记过程中标记线程就基于这块内存对象进行标记,后面Top指针就可以随意往前移动了。所以按照正常的逻辑应该是这样:

上图中Initial Marking刚开始的时候,Top指针和TAMS指针指向同一个内存位置,[Bottom, TAMS)这块内存区域有一个对应的bitmap,bitmap中每一位代表对应内存区域对象是否存活。经过并发标记之后,Remark开始的时候,Top指针因为应用线程有分配对象所以会向前移动,并发标记线程独立标记[Bottom, TAMS)这块内存区域对应的对象,标记后的结果使用bitmap表示(其中黑色方块表示对应对象被标记为活跃对象)。在并发标记过程中新生成的对象都分配在[TAMS, Top) 这块内存区域,G1算法会将这部分新生成的对象都认为是存活对象,这轮标记不处理这部分新生成对象,留到下一轮标记处理。
现在继续来看SATB算法如何处理并发标记过程中引用关系变更问题。在并发标记阶段,引用变更发生后通过写屏障会将这些变更记录并保存在一个队列里(satb_mark_queue),在remark阶段会扫描这个队列,通过这种方式,旧的引用所指向的对象就会被标记上,其子孙也会被递归标记上,这样就不会漏标记任何对象,snapshot的完整性也就得到了保证。
实际上介绍到这里基本上已经将SATB算法实现介绍的比较清楚了。下图是完整的两轮并发标记示意图(摘自网上):

 

SATB算法 vs Incremental Update算法

G1的SATB算法在Remark阶段不需要暂停遍历整堆对象,只需要扫描satb_mark_queue,所以避免了这个阶段可能的长耗时。但是CMS垃圾回收器中增量更新算法因为无法知道哪些对象是并发标记阶段新增的,所以在Remark阶段需要重新扫描GC Roots标记整堆对象,这就可能带来不可控的长耗时暂停。

 

标签:标记,对象,Top,SATB,并发,算法,STAB
From: https://www.cnblogs.com/zhengbiyu/p/17289024.html

相关文章

  • JVM的垃圾收集算法
    介绍分代收集理论和几种垃圾收集算法的思想及其发展过程。分代收集理论当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(GenerationalCollection)的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,分代收集理论它建立在两个分代假说之上:......
  • m基于多核学习支持向量机MKLSVM的数据预测分类算法matlab仿真
    1.算法描述        20世纪60年代Vapnik等人提出了统计学习理论。基于该理论,于90年代给出了一种新的学习方法——支持向量机。该方法显著优点为根据结构风险最小化归纳准则,有效地避免了过学习、维数灾难和局部极小等传统机器学习中存在的弊端,且在小样本情况下仍然具有......
  • 笔记1. O(NlogN)的排序算法
    目录准备工作递归行为——求数组的最大值master公式归并排序——912.排序数组Merge函数归并排序主函数nlogn与n^2排序本质差距小和问题剑指Offer51.数组中的逆序对快排荷兰国旗问题快排1.0快排2.0快排3.0准备工作打印数组voidPrintfNums(int*nums,intnumsSize){......
  • m基于多核学习支持向量机MKLSVM的数据预测分类算法matlab仿真
    1.算法描述20世纪60年代Vapnik等人提出了统计学习理论。基于该理论,于90年代给出了一种新的学习方法——支持向量机。该方法显著优点为根据结构风险最小化归纳准则,有效地避免了过学习、维数灾难和局部极小等传统机器学习中存在的弊端,且在小样本情况下仍然具有良好的泛化能力,从......
  • 欧几里得算法与更相减损法复习
    (1)欧几里得算法(辗转相除法),用于求两个整数的最大公因数解释:两个整数a和b,假如a=b*x+ya和b的最大公因数是d,那么a%d==0,b%d==0,也有(b*x+y)%d==0∴y%d==0即a和b的最大公因数也是b和y的最大公因数,而y=a%b1intgcd(inta,int......
  • 2023.4.5 网络最大流 Dinic算法
    网络最大流Dinic算法省选爆了qwq题目描述给出一个网络图,以及其源点和汇点,求出其网络最大流。网络流,就像水在一个水渠构成的网络中流一样,源点有无限的水,每条边有最大流量限制,求流到汇点的最大流量。更菜一点的EK算法自行了解,此处我们用dinic算法解决问题。这些网络流算法的......
  • MA323财经数学pytho算法
    MA323ComputationalMethodsinFinancialMathematicsAssessedCoursework(2023)02/03/20231Guidelines1.1SubmissionYourcourseworkmustbesubmittedbyMonday17thApril2023,4pm(UKtime).AllconsequencesregardinglatesubmissioncanbefoundontheSch......
  • 四种语言刷算法之重排链表
    力扣143. 重排链表1、C/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/voidreorderList(structListNode*head){structListNode*p=head;intcount=0;while(p){p......
  • 算法问题——动态规划和回溯算法问题
    回溯算法树形问题排列问题组合问题二位平面的回溯算法回溯递归问题树形问题17.电话号码的字母组合(全排列的问题)/***Copyright(C),2018-2020*FileName:letterCombinations*Author:xjl*Date:2020/3/2015:30*Description:给定一个仅包含数字2-9的字......
  • 算法训练——剑指offer(动态规划算法)摘要
    摘要一、动态规划原理与解题方法二、动态规划算法练习题目2.1跳台阶问题package动态规划算法;importorg.junit.Test;/***@ClassnameJZ69跳台阶问题*@DescriptionTODO*@Date2022/2/1118:54*@Createdbyxjl*/publicclassJZ69跳台阶问题{/**......