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

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

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

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. 将整理完成后的空闲内存区加入到空闲列表里


Published

26 September 2021

Category

development

Tags