JVM- CardTable

469 阅读1分钟

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

image.png

CardPage使用的是一个字节大小,而没有采用位存储 使用byte数组而不是bit数组主要是速度上的考量,现代计算机硬件都是最小按字节寻址的,没有直接存储一个bit的指令,所以要用bit的话就不得不多消耗几条shift+mask指令。

CardTable主要作用

CardTable主要是用来解决跨代引用的问题

image.png

Card是标志一个内存区域是否是Dirty, 比如 老年代引用了 新生代,那么对应的老年代就可以标记为Dirty,在做YGC的时候就不需要扫描整个老年代

image.png

上图所示,当执行YGC的时候 仅通过GCRoots就可能认为对象B为垃圾数据,但是对象B被老年代中c所引用,所以这个时候就需要依赖CardTable中的Dirty(脏页)的标识,将老年代中对应脏页的对象添加到GCRoots中做为根引用扫描