一、介绍
1、定义: Garbage First,jdk9后默认垃圾收集器。
2、适用场景
- 同时注重吞吐量和低延迟,默认暂停目标时200ms。
- 超大堆内存会将内存划分为多个相等的Region。
- 整体上使用标记-整理算法,两个区域使用复制算法。
3、相关VM参数
- -XX:UseG1GC
- -XX:G1HeapRegionSize=size
- -XX:MaxGCPauseMillis=time
二、垃圾回收阶段
1、Young Collection
如图所示:
- 内存被分为很多个大小相等的区域。
- E(Eden)区内存不足时触发minor GC 将存活对象转移到S(Surviror)区(To),From中存活对象转移到To中(S->S),From和To调换位置(minor GC 后Surviror中对象存在于From中)。
- S->O,幸存区对象晋升到老年代。
跨代引用
- 老年代对象引用了新生代对象,跨代引用。
- 老年代中红色区域为卡表中的脏卡,新生代对象通过Remmember Set记录对应脏卡。
- 在引用变更时,post-write barrier更新脏卡指令放入dirty card queue队列中,等待线程执行。
- current refinement threads 更新 Remmember Set。
2、Young Collection +CM
老年代区域占比达到45%时,触发并发标记。
3、MixedCollection
注意
- O->O,回收老年代中的垃圾使用复制算法,将一个老年代区域中存活的对象复制到另一个老年代区域。
- G1垃圾收集器选择回收价值高的老年代区域(即可回收较大的空间),为了在MaxGCPauseMillis时间内完成垃圾回收。
- 最终标记,需要STW,避免其他用户线程在标记过程中,产生浮动垃圾。