现在触发Minor GC 开始做可达性分析 但是有些对象扫描不到
原因是老年代有些引用着年轻代的某些对象 (也就是老年代的对象里面有个成员变量是在年轻代中)那么这些对象是不能被回收的
怎么办?
遍历整个老年代的GC Roots 然后再逐个扫描新生代中的对象,因为太耗费时间和性能了,显示是不可能的。
在新生代引入记录集(Remember Set)的数据结构,避免整个老年代都加入GC Roots的扫描范围。
hotSpot使用的一种叫做卡表(cardTable)的方式实现记录集,也是目前最常用的一种方式,它就是Remember Set的一种实现
卡表
卡表类似于一个数组 每个元素都会存放卡页的地址 ,在老年代会开辟一个一个的空间来存放卡页
每个卡页都会存放一个或多个对象 ,只要有一个对象存在跨代引用 ,那么卡页标示就为1,标示卡页里面有对象引用了年轻代。
在年轻代GC时,会去查询数组 如果有标示1的元素那么就会查询到卡页,然后全部做为GC Roots的对象
卡表的维护
上述说了卡页会变脏,那么这个维护的关系是什么时候进行的? 在引用的字段赋值时,HotSpot使用写屏障来维护卡表的状态。