GC回收碰到跨代引用的对象怎么办?

现在触发Minor GC 开始做可达性分析 但是有些对象扫描不到

原因是老年代有些引用着年轻代的某些对象 (也就是老年代的对象里面有个成员变量是在年轻代中)那么这些对象是不能被回收的

怎么办?

遍历整个老年代的GC Roots 然后再逐个扫描新生代中的对象,因为太耗费时间和性能了,显示是不可能的。

在新生代引入记录集(Remember Set)的数据结构,避免整个老年代都加入GC Roots的扫描范围。

hotSpot使用的一种叫做卡表(cardTable)的方式实现记录集,也是目前最常用的一种方式,它就是Remember Set的一种实现

卡表

卡表类似于一个数组 每个元素都会存放卡页的地址 ,在老年代会开辟一个一个的空间来存放卡页

每个卡页都会存放一个或多个对象 ,只要有一个对象存在跨代引用 ,那么卡页标示就为1,标示卡页里面有对象引用了年轻代。

在年轻代GC时,会去查询数组 如果有标示1的元素那么就会查询到卡页,然后全部做为GC Roots的对象

卡表的维护

上述说了卡页会变脏,那么这个维护的关系是什么时候进行的? 在引用的字段赋值时,HotSpot使用写屏障来维护卡表的状态。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值