带对象引用的C#garbage collection

时间:2011-07-04 01:37:49

标签: c# .net garbage-collection object-reference

在C#中,当我有两个对象 obj1 obj2 List<string>组成时,我将这两个对象分配给同一个{{1}对象。

如果我对obj1的引用超出范围但我对obj2的引用没有,obj1是否仍然有资格进行垃圾回收,或者是否存在一些依赖性问题,因为仍然存在对List<string>对象的引用? / p>

5 个答案:

答案 0 :(得分:3)

在您的情况下,obj1 必须符合条件 才能进行垃圾回收。

您需要在此处查看Jon Skeet's answer。它清楚地解释了垃圾收集如何在对象引用上工作。

Object's Lifetime in C#上的一个很好的教程。

答案 1 :(得分:1)

只要没有对obj1本身的引用,

obj1就有资格进行垃圾收集。

答案 2 :(得分:1)

  

如果我对obj1的引用消失了   范围,但我对obj2的引用确实如此   不,obj1仍然有资格获得   垃圾收集,还是有一些   依赖性问题,因为有   仍然是对列表的引用   对象

如果我理解正确,则表示obj1obj2都属于List<string>类型,并且都指向相同 List<string>实例。

obj1超出范围时,仍然会有obj2作为List<string>实例的有效引用,因此列表不能被垃圾回收。

如果obj1是堆上的引用类型(即其属性之一)的一部分,则它占用的内存空间可能被垃圾收集为外部对象的一部分。如果它只是堆栈上的引用,则不会涉及GC,因为当obj1超出范围时,堆栈将在方法调用结束时解除。

请记住,obj1只是堆上对象的引用(以某种方式指针) - 只有当没有引用指向它时,此对象才可能被垃圾收集。

答案 3 :(得分:0)

此问题中定义了三种内存用途:

  • 指向名为List<string>的{​​{1}}实例的指针。
  • 指向名为obj1的{​​{1}}实例的指针。
  • List<string>
  • 的实例

如果obj2超出范围,但List<string>没有,那么垃圾收集后只剩下以下内容:

  • 指向名为obj1的{​​{1}}实例的指针。
  • obj2
  • 的实例

重要的是要记住C#在大多数情况下抽象出指针的概念,以便您可以安全地将List<string>obj2视为List<string>而不是指针,而是指针他们是。

答案 4 :(得分:-1)

如果obj1是List的成员,则在父列表被垃圾回收之前,它不可用于垃圾回收。

所以:

List<string> l = new List<string>();

string a = "one";
l.Add(a);

{
    string b = "two";
    l.Add(b);
}

在此列表的末尾,a在范围内,b超出范围,但两者仍在列表l中有引用,因此两者都不符合垃圾回收的条件