Garbage First algorithm

G1即垃圾优先收集器,理念是以不完全的GC来降低的 #STW
尽管G1收集器有分代的概念,但本质上是一个 #分区收集器

在整个堆中,以一个大小的单位分割成很多小的规则的块.
和其他例如[[Serial]], [[Parallel Scavenge]]等收集器不同,G1中的 #新生代 和 #老生代 并不是连续的,而是散落开的,一块一块散落在整个堆里


因此每次回收不需要扫描整个堆,而只需要查看几个需要清理的块即可.除此之外,每个里又分成很多个,GC只需要对这些块里面需要清理的区进行处理即可.
G1是一个可以指定 #STW 时间上限的收集器,其原理就是,如果上限越低,为了降低收集时间G1会回收更少的块.

1
java -XX:+UseG1GC Main.java

处理流程

oracle

  1. 初始标记
    #STW, 和young GC一起进行
    对所有与 #gcroot 直接关联的对象进行标记,该过程很快
    标记指向老生代对象的整个幸存区块
  2. 幸存区扫描
    必须在young GC发生之前完成
    在前一个阶段标记的幸存区块中找到引用老生代的对象
    此过程进行可达性分析,速度很慢,但由于不存在 #STW 因此不影响用户线程
  3. 并发标记
    #并发 可被young GC打断
    在整个堆中标记存活对象
  4. 重标记
    #并发 #STW 使用snapshot-at-the-beginning #SATB 算法
    重新做一次标记,因为前一阶段的标记过程用户线程也在运行,因此可能存在漏标记的对象
  5. 清理
    1. 汇总存活对象,释放内存 #STW
    2. 更新 Remember Set #STW
    3. 将整理完成后的空闲内存区加入到空闲列表里

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