G1特点
- 可以基于用户设定的停顿时间,去回收。
- 没有full gc
G1中的几个概念
Region
将堆区划分为多个Region,每个Region可以表示新生代,老年的等。
每个Region大小是2的幂次方。Humongous是专门用来存放大对象的(超过Region大小一般的对象),并且直接放在老年代。
SATB
SATB原始快照,通过三色标记算法来处理并发标记时用户线程更新引用的问题。
PS: 并发标记的两种处理方法:增量更新与原始快照
RSet
用来辅助GC过程,每个Region都有RSet记忆集。 RSet用来记录别的Region指向自己的指针,并记录指针分别在哪些Card范围内。
Pause Prediction Model
停顿预测模型,通过用户设定的GC停顿时间(参数-XX:MaxGCPauseMillis),G1以衰减平均值为理论基础,计算需要回收的Region数量从而进行满足。
G1收集器执行过程
-
初始标记 STW,仅标记GC ROOT能直接关联的对象。并修改TAMS指针(确保用户线程能正确的创建新的对象)。
-
并发标记 递归整个对象图,与用户线程并发执行。扫描完成后处理SATB记录下的引用变动的对象。
-
最终标记 STW,处理并发标记遗留的SATB记录。
-
筛选回收 STW,负责更新Region的统计数据,对各个Region的回收价值与成本排序,根据用户设定期望的停顿时间来制定回收计划,可以选择任意多个Region数量构成回收集合。然后把决定回收的那一部分Region中存活的对象复制到空的Region,再清理掉旧Region的全部空间。
参考
- 书籍:深入理解JVM
- tech.meituan.com/2016/09/23/…