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