垃圾收集器在这种情况下会做什么?

时间:2012-02-07 12:27:12

标签: c# .net c#-4.0 garbage-collection clr

有两种情况我试图理解GC将如何行动

1-有两个对象 - object1和object2 object1对object2有引用,object2对object1有引用 现在,这两个对象都没有被使用,GC可以收集它们。

会发生什么? GC会跳过这个系列吗? ?

2-同样的问题,但我们有4个(或n个)对象相互引用。 GC会对此案件做什么???

5 个答案:

答案 0 :(得分:5)

  

与COM不同,公共语言运行库不使用引用计数来管理对象生存期。相反,垃圾收集器跟踪对象引用并标识通过运行代码无法再访问的对象。

     

这简化了组件编程,因为您不必担心循环引用。 如果一组对象包含彼此的引用,但这些对象中没有一个直接或间接地从堆栈或共享变量引用,则垃圾收集将自动回收内存

http://msdn.microsoft.com/en-us/library/0t81zye4(v=vs.71).aspx

答案 1 :(得分:3)

.NET使用的GC是tracing garbage collector(“Mark and Sweep”是相关术语)

如果通过跟随程序内存中非垃圾部分的指针/引用无法再访问内存对象,则将其视为“垃圾”。

为了确定什么是可达的和什么不可达,GC首先建立一组根引用/指针。这些是保证可以访问的引用。示例包括局部变量和静态字段。

然后递归地跟踪这些引用(trace)并将它遇到的每个对象标记为“not garbage”。一旦它用完了后面的引用,就会进入“扫描”阶段,其中每个未标记为“非垃圾”的对象都被释放(可能包括调用对象的终结器)。

因此,只要“对象响铃”中的任何对象都没有被“实时”对象的任何部分引用,就会被垃圾收集。

答案 2 :(得分:0)

AFAIK,GC只会收集不再有任何引用的对象。因此,只要某个对象具有对它的引用,就不会收集它。

如果对象存在的时间足够长,它们将在收集周期的下一阶段结束。

答案 3 :(得分:0)

我不确定但您可以通过创建大量对象(4个线程,填充列表)然后将列表归零来尝试它。 如果ram发生故障,它就知道不再引用被引用对象的块,如果它不存在则不会:)

答案 4 :(得分:0)

Does the CLR garbage collection methodology mean it's safe to throw circular object references around?的重复。 .NET的GC不是引用计数器,它遍历所有已分配的对象并尝试将它们链接到GC根对象。它可以处理和处理这些循环引用,无论它们有多少。