引言:基于经典分代理论,虚拟机的堆内存可以划分成新生代,老年代。当虚拟机需要仅对新生代进行回收时(Minor GC),新生代中可能存在跨代引用,即老年代的对象中有指向新生代对象的引用。为此,正常情况下需要扫描整个老年代来确定哪些对象引用了新生代的对象,但这种方式的开销太大,所以JVM引入了记忆集的概念,采用记忆集的方式,能有效减小开销。
G1收集器出现之前的记忆集
首先,我们要了解记忆集(Rset)的概念,下面是ORACLE官方对于记忆集的解释
The data structure for keeping this information (old generation pointers to young generation objects), is a remembered set. A card table is a particular type of remembered set.
根据ORACLE官方的说法,记忆集是记录着从老年代向新生代引用的一种数据结构,Card Table是其中一种特殊的记忆集。在G1收集器出现之前,Card Table是解决跨代引用的实际方案。

如上图所示,把老年代划分成若干个卡页,而卡表是以字节为单位的数组,通过卡的索引index来对应卡页,每一个数组元素对应一个卡页,卡页的大小为512字节(HotSpot实现)。卡页中可能存在多个对象,但是只要当卡页中存在一个对象引用了新生代的对象&