G1垃圾回收器

参考大佬文章整理笔记。
原文:https://blog.csdn.net/Java_3y/article/details/121529431

CMS垃圾回收的停顿时间不可预估,G1是在CMS上的升级,可以设定一个预想的停顿时间,G1会尽量满足。
G1其实就是全局并发标记 + 拷贝存活对象

之前的堆分区是物理分区,G1垃圾收集器不在是物理分区,而是逻辑分区。分代的概念还是一样的。
下图是G1的堆空间分布
在这里插入图片描述

大对象区域是用来存储超过Region内存的一半的大对象。
以前是对整个堆进行垃圾回收,区域大回收时间就不好控制,划分成多个小区域后就比较容易控制回收时间了。

G1的回收过程?

主要分为Minor GC(Young GC)和Mixed GC,特殊场景可能会触发Full GC;
Minor GC:
Minor GC跟之前的一样Eden区满了之后就会触发,分为三个步骤:根扫描、更新&&处理 RSet、复制对象
a.根扫描:跟CMS类似,是一个初始标记的过程;
b.之前的Minor GC,它是通过「卡表」(cart table)来避免全表扫描老年代的对象(跨代引用),而G1解决跨代引用的问题的存储叫RSet;RSet这种存储在每个Region中都有,它记录着其他Region引用当前Region的对象关系;如下图:
在这里插入图片描述

对于年轻代的Region,它的RSet只保存了来自老年代的引用(因为年轻代的没必要存储,自己都要做Minor GC了);
对于老年代的Region,它的RSet也只会保存老年代对它的引用(在G1垃圾收集器,老年代回收之前,都会先对年轻代进行回收,所以没必要保存年轻代的引用);
之前的将脏页的对象加入GC Roots在G1里面就是处理RSet的信息,将老年代持有年轻代对象的引用都加入GC Roots下;
c.把扫描之后活着的对象复制到空的Region区或者老年代去,清除原先的空间。

G1中有个名词叫CSet,全称 Collection Set,里面保存了一次GC中的Region,CSet中所有存活的对象都会被转移到可用的Region上;
Minor GC 的最后还会处理一下软引用、弱引用、JNI Weak等引用,结束收集。

Mixed GC:
当堆空间的占用率达到一定的阈值后就会触发Mixed GC,默认是45%,有参数决定;
Mixed GC一定会回收年轻代,也会回收一部分老年代的Region,所以它是一个混合的GC
Mixed GC 依赖「全局并发标记」统计后的Region数据。
「全局并发标记」它的过程跟CMS非常类型,步骤大概是:初始标记(STW)、并发标记、最终标记(STW)以及清理(STW)
a.也是一个扫描 GC Roots的操作,年轻代和老年代都会扫描,会停顿,但是因为不会向下追溯,所以还是比较快的;
b.GC线程收集各个Region的对象存活信息,从GC Roots向下追溯,比较耗时,但是因为是并发的,所以不会造成停顿;
c.跟CMS一样,重新标记那些在并发标记阶段发生了变化的对象;区别是CMS是重新扫描所有的线程栈和整个年轻代作为GC Roots,而G1 中解决并发标记阶段引用变更的问题使用的是SATB算法,简单的理解就是在G1开始的时候为存活的对象做了一次快照,在并发标记时把每次发生引用变化时旧的引用值记录下来,然后在重新标记阶段只扫描发生过变化的引用,看有没有存活的,存活的加入到GC Roots下;
SATB算法有个问题是会产生浮动垃圾,因为如果在一开始G1认为该对象是活的,那么就不会回收它,即使它可能在并发阶段被标记为垃圾,只能等待下一次回收。
d.这个阶段主要清点和重置标记状态,会产生停顿的,所以会根据预想的停顿时间来决定本次回收多少Region,一般会选择所有的年轻代Region和部分垃圾多的老年代Region进行回收;将活的复制到空白的Region中去。

G1一次回收不一定会回收所有的垃圾,而是会根据预想的停顿时间来选择要回收的Region数量。

Full GC:
如果在Mixed GC中无法跟上用户线程分配内存的速度,导致老年代填满了而无法继续进行Mixed GC,就会降级到serial old GC来收集整个堆空间;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值