Shenandoah algorithm

#分区收集器
#并行

source code

alt

处理流程

  1. 初始标记
    做下一阶段的准备活动
    扫描 #gcroot 并 #STW
  2. #并发 标记
    检查整个堆以分析对象可达性
  3. 最终标记
    完结并发标记阶段,等待所有更新队列中未完成的标记任务结束,然后重新扫描一遍 #gcroot
    根据扫描所得的结果集启动copy流程,对某些 #gcroot 进行初步复制,并准备进入下一阶段
    触发 #STW
  4. #并发 清理
    分析结果集,将并发标记后找到的垃圾区域(指没有任何存活对象的区)进行回收
  5. #并发 复制
    将结果集中的对象并发复制到其他区中
  6. 初始化更新引用
    #STW
    本阶段用来检查保证所有线程都已经完成复制工作,以确保下一阶段的工作能正常进行
  7. #并发 更新引用
    遍历整个堆,更新那些在并发复制过程中被移动过的老引用
    扫描过程是线性的,而不是扫描对象关系树
  8. 最终更新引用
    #STW
    完结引用更新阶段,并重新更新 #gcroot
    回收结果集中的区,因为清理过后结果集中的对象已经没有引用指向它们了
  9. #并发 清理
    回收结果集区

Shenandoah algorithm
https://rug.al/2021/2021-09-26-shenandoah/
Author
Rugal Bernstein
Posted on
September 26, 2021
Licensed under