JVM系统自学笔记7--G1垃圾回收器

一、介绍

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),FromTo调换位置(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,避免其他用户线程在标记过程中,产生浮动垃圾。
发布了171 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/QilanAllen/article/details/105636312