一、跨代引用问题
假设老年代的 A 对象引用新生代的 B 对象,那在 young GC 的时候,仅仅从新生代的 GC root 出发就会以为 B 是垃圾,导致错误回收,而如果从整个 GC root 出发遍历成本就太高了。因此用记忆集来解决这个问题,在记忆集中保存从非收集区域(A 所在的老年代)指向收集区域(B 所在的新生代)的指针集合,在 young GC 的时候,将记忆集中保存的指针对象加入到 GC root 中进行扫描即可。
二、记忆集具体实现方式
三、怎么在编译时进行卡表元素的维护?写屏障
在虚拟机层面对“引用类型字段赋值”这个动作的AOP切面!相当于 Around 通知。在赋值后将对应卡表元素变脏(1)就是一个写后屏障,注意这个写屏障和 JMM 中的内存屏障不同