Java基础之《JVM性能调优(12)—G1的YoungGC》

一、G1 young gc算法的垃圾回收和内存更新

1、Young GC的触发条件
Eden区的大小范围 = [ -XX:G1NewSizePercent, -XX:G1MaxNewSizePercent ] = [ 整堆5%, 整堆60% ]
在[ 整堆5%, 整堆60% ]的基础上,G1会计算下现在Eden区回收大概要多久时间,如果回收时间远远小于参数-XX:MaxGCPauseMills设定的值(默认200ms),那么增加年轻代的region,继续给新对象存放,不会马上做YoungGC。
G1计算回收时间接近参数-XX:MaxGCPauseMills设定的值,那么就会触发YoungGC。

2、垃圾回收

1)停止 STW
young gc的整个过程是STW的

2)选择CSet
选择要收集的CSet,对于YGC来说,整个新生代分区都是CSet

3)根扫描(Ext Root Scaning)
从gc root出发
复制根节点直接引用的对象到Survivor区
把根节点直接引用对象的field属性(间接对象)压入到队列PSS(ParScanThreadState)中

4)更新RSet(Update RSet)
前面Refine提到了RSet的更新是异步完成的,所以在GC开始时,有可能DCQ中的引用关系还没有处理完,所以GC需要把剩下的引用关系处理完。

5)扫描RSet(Scan RS)
从eden的region的RSet扫描出引用者,扫描的方式是从rset的key=引用region地址,value=card地址,即从card扫描出引用者对象(老年代对象)。
找到老年代引用者对象后,更新老年代引用对象的引用地址,从eden更改为survivor的地址。

6)复制(Object Copy)
这里的复制和根的复制不一样,这里的复制指的是那些被CSet收集到的对象,是root直达对象的field对象,并且这个对象在新生代之中。这个时候就需要复制到这个对象到新的分区。
复制过程:从PSS的队列消费,由每个GC线程分配缓冲区GCLAB,最终落在目标Region中,可能是Survivor类型Region,也可能是Old类型Region(如果达到晋升条件的话)。

7)重构RSet(Redirty)
由于把对象复制到新的region(survivor),必将导致新的region RSet不正确,故,必须重新更新RSet。

8)回收CSet(Free CSet)
回收CSet分区的所有空间,并加入到空闲分区中。
存活对象复制到Survivor区之后,一些分区就不存在存活对象了,可以回收到空闲分区列表(free list),空闲列表的region下次可以再次使用。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值