CardTable
什么是CardTable
CardTable就是一个数组,通过堆除以512字节大小计算出CardTable的长度,CaedTable中每一个索引理解为一个CardPage,也就是CardPage代表内存中512个字节大小的区域
card_table_size = heapSize/512
假设堆内存为1G 那么CardTable的长度为 1G/512B=2048
也就是会存在2048个CardPage
如何找到对象对应索引
CARD_TABLE [this address >> 9] = 0;
当前内存地址对应卡表中的索引是通过当前内存地址向右移9位,相当于除以512了,就可以找到对应对象所在CardPage
CardPage使用的是一个字节大小,而没有采用位存储 使用byte数组而不是bit数组主要是速度上的考量,现代计算机硬件都是最小按字节寻址的,没有直接存储一个bit的指令,所以要用bit的话就不得不多消耗几条shift+mask指令。
CardTable主要作用
CardTable主要是用来解决跨代引用的问题
Card是标志一个内存区域是否是Dirty
, 比如 老年代引用了 新生代,那么对应的老年代就可以标记为Dirty
,在做YGC的时候就不需要扫描整个老年代
上图所示,当执行YGC的时候 仅通过GCRoots就可能认为对象B
为垃圾数据,但是对象B
被老年代中c
所引用,所以这个时候就需要依赖CardTable中的Dirty(脏页)
的标识,将老年代中对应脏页的对象添加到GCRoots中做为根引用扫描