资讯专栏INFORMATION COLUMN

聊聊Garbage Collector的SATB

iflove / 1414人阅读

摘要:序本主要研究一下的在进行的都采用了的技术面向的垃圾收集器,它的主要有包括这个阶段用到了进行包括在进行的时候采用了的技术全称为,其要点如下的过程就是遍历标记,采用的是三色标记算法,这三种颜色为表示还未访问到访问到但是它用到的引用还没

本主要研究一下Garbage Collector的SATB

CMS、G1、Shenandoah在进行concurrent marking的都采用了SATB的技术
Shenandoah

Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有

Snapshot-at-the-beginning concurrent mark包括Init Mark(Pause)、Concurrent Mark、Final Mark(Pause)

Concurrent evacuation(这个阶段用到了Brooks Pointers(object version change with additional atomically changed indirection)进行copy)

Concurrent update references (optional)包括Init update Refs(Pause)、Concurrent update Refs、Final update Refs(Pause)

Shenandoah在进行concurrent marking的时候采用了SATB的技术
SATB

SATB全称为Snapshot At The Beginning,其要点如下:

mark的过程就是遍历heap标记live object,采用的是三色标记算法,这三种颜色为white(表示还未访问到)、gray(访问到但是它用到的引用还没有完全扫描)、black(访问到而且其用到的引用已经完全扫描完),整个三色标记算法就是从GC roots出发遍历heap,针对可达对象先标记white为gray,然后再标记gray为black;遍历完成之后所有可达对象都是black的,所有white都是可以回收的

SATB仅仅对于在marking开始阶段进行"snapshot"(marked all reachable at mark start),但是concurrent的时候并发修改可能造成对象漏标记,比如

对black新引用了一个white对象,然后又从gray对象中删除了对该white对象的引用,这样会造成了该white对象漏标记

对black新引用了一个white对象,然后从gray对象删了一个引用该white对象的white对象,这样也会造成了该white对象漏标记

对black新引用了一个刚new出来的white对象,没有其他gray对象引用该white对象,这样也会造成了该white对象漏标记

对于三色算法在concurrent的时候可能产生的漏标记问题,SATB在marking阶段中,对于从gray对象移除的目标引用对象标记为gray,对于black引用的新产生的对象标记为black;由于是在开始的时候进行snapshot,因而可能存在Floating Garbage

小结

CMS、G1、Shenandoah在进行concurrent marking的时候都采用了SATB的技术;SATB concurrent mark便是Shenandoah GC的第一个cycle

遍历heap标记live object,采用的是三色标记算法,这三种颜色为white(表示还未访问到)、gray(访问到但是它用到的引用还没有完全扫描)、black(访问到而且其用到的引用已经完全扫描完),整个三色标记算法就是从GC roots出发遍历heap,针对可达对象先标记white为gray,然后再标记gray为black;遍历完成之后所有可达对象都是black的,所有white都是可以回收的

SATB仅仅对于在marking开始阶段进行"snapshot"(marked all reachable at mark start);在marking阶段中,对于从gray对象移除的目标引用对象标记为gray,对于black引用的新产生的对象标记为black;由于是在开始的时候进行snapshot,因而可能存在Floating Garbage

doc

snapshot-at-the-beginning

Shenandoah GC: Concurrent parallel marking

Floating Garbage

[HotSpot] VM 关于incremental update与SATB的一点理解

Java Hotspot G1 GC的一些关键技术

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73871.html

相关文章

  • Java读取GC耗时和次数

    代码 public static void main(String[] args) { for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) { long count = gc.getCollectionCount(); ...

    Leo_chen 评论0 收藏0
  • 细述 Java垃圾回收机制→Types of Java Garbage Collectors

    摘要:并发标记清除垃圾回收器,使用多个线程来扫描堆内存并标记可被清除的对象,然后清除标记的对象。垃圾回收器应用于大的堆内存空间。它将堆内存空间划分为不同的区域,对各个区域并行地做回收工作。它会通过把重复的值移动到同一个数组来优化堆内存占用。 本文非原创,翻译自Types of Java Garbage Collectors在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的。...

    Julylovin 评论0 收藏0
  • [JVM 相关] Java 新型垃圾回收器(Garbage First,G1)

    摘要:适用收集场景新生代收集老年代收集并行收集器又叫吞吐量收集器应用于多核系统。它是为了平衡延时和吞吐量之间的一种最优关系。 回顾传统垃圾回收器 HotSpot 垃圾收集器实现 Serial Collector(串型收集器) 使用场景,大多数服务器是单核CPU。适用收集场景:1. 新生代收集(Young Generation Collection)2. 老年代收集(Old Genera...

    Jason 评论0 收藏0
  • JAVA SE 6 GC调优笔记

    摘要:要加左右,因为位机器上的对象更大要加左右,因为位机器上的对象更大对于服务器程序的原则是保证越多内存越好将和设置成一样大,关掉自动调整大小的机制。对于服务器程序的原则是决定你能够给的最大内存,然后根据的大小来找到最好的设置。 Generations Young Generation 组成:eden + 2 survivor spaces Young generation的gc称作min...

    cartoon 评论0 收藏0
  • 【译】深入理解G1GC日志(一)

    摘要:表示允许垃圾收集线程处理本次垃圾收集开始前没有处理好的日志缓冲区,这可以确保当前分区的是最新的。垃圾收集线程在完成其他任务的时间展示每个垃圾收集线程的最小最大平均差值和总共时间。 本文翻译自:https://www.redhat.com/en/blog/collecting-and-reading-g1-garbage-collector-logs-part-2?source=auth...

    spacewander 评论0 收藏0

发表评论

0条评论

iflove

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<