为什么CLI中没有弱引用内置类型

时间:2012-09-07 20:47:56

标签: c# .net garbage-collection weak-references

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

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

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

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

2 个答案:

答案 0 :(得分:2)

可能是因为他们往往不够经常需要更加突出的代表性。

答案 1 :(得分:0)

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