我想知道为什么弱引用不是内置类型,它们被垃圾收集处理为类似于标准对象引用。在 C# 中,您必须要么使用 WeakReference 类(它对性能和内存有重大影响,因为它是在托管堆本身上创建并使用终结器进行清理)或手动分配 GCHandle(稍后必须再次手动释放) .
原则上,我会通过以下方式为弱引用实现 GC:
为了识别活动对象,GC 必须从所有根开始遍历对象树。如果它找到对对象的引用,则该对象被标记为可达。相反,如果它发现一个对象的弱引用,这将在第一步中被忽略。
在第二步中,GC 查找无法访问的内存块所在的位置并压缩托管堆(或至少部分堆)。当它这样做时,它必须再次遍历对象树并更新所有对已移动对象的引用(正常和弱)。此外,如果它发现对未标记为可访问的对象的弱引用,则必须将其设置为 null(或其他一些明确定义的无效内存位置)以将其标记为无效。