0

我想知道为什么弱引用不是内置类型,它们被垃圾收集处理为类似于标准对象引用。在 C# 中,您必须要么使用 Wea​​kReference 类(它对性能和内存有重大影响,因为它是在托管堆本身上创建并使用终结器进行清理)或手动分配 GCHandle(稍后必须再次手动释放) .

原则上,我会通过以下方式为弱引用实现 GC:

  1. 为了识别活动对象,GC 必须从所有根开始遍历对象树。如果它找到对对象的引用,则该对象被标记为可达。相反,如果它发现一个对象的弱引用,这将在第一步中被忽略。

  2. 在第二步中,GC 查找无法访问的内存块所在的位置并压缩托管堆(或至少部分堆)。当它这样做时,它必须再次遍历对象树并更新所有对已移动对象的引用(正常和弱)。此外,如果它发现对未标记为可访问的对象的弱引用,则必须将其设置为 null(或其他一些明确定义的无效内存位置)以将其标记为无效。

4

2 回答 2

2

可能是因为它们往往被需要的次数不够多,无法获得更突出的代表。

于 2012-09-07T20:51:49.203 回答
0

垃圾收集器在常规引用方面已经做得很好,即使存在循环引用。(在引用计数的世界中,这是一个非常不同的故事)。您可以在对象之间进行循环引用,并且在大多数情况下它会被正确清理。这意味着您很少需要 WeakRef,因此它可能不保证内置在 CLI 中。

于 2012-09-07T21:07:02.607 回答