2

任何人都可以在.Net 的垃圾收集过程中解释卡表的概念和编写障碍吗?我真的无法得到这些术语的解释,即它们是什么,它们如何有用以及它们如何参与 GC。任何帮助将非常感激。

4

1 回答 1

3

卡表是一个位数组,在老年代的每块 256 字节内存中一个位。这些位通常为零,但当写入老年代对象的字段时,对应于对象内存地址的位设置为 1。这称为执行写屏障。

.NET 中的垃圾收集器是分代的,并且有一个阶段,它只跟踪和收集年轻代中的对象。所以它从根开始遍历对象图,但不会递归到老一代中的对象。这样,它只跟踪整个对象图的一小部分。

为了找到开始跟踪的根,它会扫描程序的局部和全局变量以查找年轻代对象。但它会错过仅从老一代对象引用的对象。因此它也会扫描老年代中设置了卡表位的对象的字段。

然后在年轻代收集完成后,它将所有卡表位重置为零。

于 2016-09-10T13:41:13.517 回答