G1的RSet解读

G1垃圾收集器使用RSet(Remember Set)记录跨代引用,以优化垃圾回收效率。RSet采用point in结构,记录谁引用了自己。在 Minor GC 和 Major GC 中,RSet帮助避免全堆扫描,但会带来额外的内存开销和可能的浮动垃圾问题。G1主要关注老年代引用新生代和老年代引用老年代的记录,通过写屏障更新RSet并过滤不必要的写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RSet介绍

在G1中,引入了RSet(Remember Set,记忆集)的概念,用来记录不同代际之间的引用关系,目的是为了加快垃圾回收的速度。

通常有两种方法记录引用关系,分别为point out和point in。比如a=b(a引用b),若采用point out结构,则在a的RSet中记录b的地址;若采用point in结构,则在b的RSet中记录a的地址。

G1的RSet采用的是point in结构,即谁引用了我。(Card Table采用的是point out结构)

为什么需要记录跨代的引用

JVM一般都会对内存进行分代处理,以提高内存分配和垃圾回收的效率。Minor GC只会回收年轻代,Major GC只会老年代,无论是哪一种GC都会面临跨代引用的情况,比如老年代对象引用新生代或者新生代对象引用老年代。

Minor GC在回收年轻代时,需要判断年轻代的对象是否存活,而年轻代的部分对象可能被老年代的对象引用,因此必须扫描老年代才不会发生误判年轻代的对象为垃圾;同理,在回收老年代时,也需要扫描年轻代。

那么无论是只回收新生代还是老年代,都需要扫描其他代的对象,相当于进行全堆扫描,效率很低。那么将代际之间的引用关系记录在一个单独的地方,只需要扫描这个地方即可,避免全堆扫描。

RSet带来的问题

  1. RSet需要额外的内存空间来存储这些引用关系,一般是JVM最大的额外开销的1%-20%之间;<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值