【问题标题】:card table and write barriers in .net GC.net GC 中的卡表和写屏障
【发布时间】:2016-09-03 17:54:17
【问题描述】:

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

【问题讨论】:

  • 你读过威尔逊的卡片标记纸吗? doi 10.1145/66068.66077
  • 否。如果那篇文章包含我所有的答案,那么如果您能分享链接,我将不胜感激。
  • 我发现这篇文章很有帮助:msdn.microsoft.com/en-us/library/ms973837.aspx

标签: garbage-collection gc-roots


【解决方案1】:

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

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

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

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

【讨论】:

  • 卡表每 256 个字节只有 1 个位标记(我想我在其他地方读了 128 个字节),每个对象可以多于/少于 256 个字节,这如何用于精确定位老一代的一个对象?
  • 不能。卡表位引用的 256 字节内存可以包含零个、一个或多个对象。因此,您需要一个辅助数据结构来跟踪哪些对象与给定卡片重叠。
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多