是否有可能在.NET中创建"隔离岛"场景?

Asd*_*dfg 11 .net c# garbage-collection

我一直在阅读有关垃圾收集的内容,并开始了解术语"隔离岛",例如当ObjectA引用ObjectB和ObjectB同时引用ObjectA时.

有人能用C#给我一个例子吗?另外,请您解释一下这是否与"内存泄漏"相同?

Con*_*rix 16

隔离岛通常是使用参考计数器的GC中的问题.您描述的场景中的ObjectA和ObjectB都具有引用计数1,因此即使没有其他任何内容可以访问它也不会被收集.

然而,这在.NET中不会发生,因为.NET的GC使用标记和扫描算法.它从根开始并创建一个对象图,因此只有根植的项才能在集合中生存.这意味着什么都不能"孤立"


Joe*_*orn 7

.Net中的垃圾收集器不使用引用计数来知道它何时可以收集对象.相反,它构建了一个对象图,其中当前可访问的对象(读取:在范围或全局中)位于图的根部.然后使用图表来查看内存中的每个对象是否都连接到根目录; 任何未连接到根的东西都被称为"无根",可以收集.即使其他对象引用了无根对象,也是如此,只要这些对象也没有根.这样,你所谈论的"隔离岛"并不是问题.