Garbage First algorithm
G1即垃圾优先收集器,理念是以不完全的GC来降低的 #STW 尽管G1收集器有分代的概念,但本质上是一个 #分区收集器
在整个堆中,以一个大小的单位分割成很多小的规则的块. 和其他例如[[Serial]], [[Parallel Scavenge]]等收集器不同,G1中的 #新生代 和 #老生代 并不是连续的,而是散落开的,一块一块散落在整个堆里
因此每次回收不需要扫描整个堆,而只需要查看几个需要清理的块即可.除此之外,每个
块
里又分成很多个区
,GC只需要对这些块里面需要清理的区进行处理即可.
G1是一个可以指定 #STW 时间上限的收集器,其原理就是,如果上限越低,为了降低收集时间G1会回收更少的块.
java -XX:+UseG1GC Main.java
处理流程
- 初始标记
#STW, 和young GC一起进行
对所有与 #gcroot
直接关联
的对象进行标记,该过程很快 标记指向老生代对象的整个幸存区块 - 幸存区扫描 必须在young GC发生之前完成 在前一个阶段标记的幸存区块中找到引用老生代的对象 此过程进行可达性分析,速度很慢,但由于不存在 #STW 因此不影响用户线程
- 并发标记 #并发 可被young GC打断 在整个堆中标记存活对象
- 重标记 #并发 #STW 使用snapshot-at-the-beginning #SATB 算法 重新做一次标记,因为前一阶段的标记过程用户线程也在运行,因此可能存在漏标记的对象
- 清理
- 汇总存活对象,释放内存 #STW
- 更新 Remember Set #STW
- 将整理完成后的空闲内存区加入到空闲列表里