引用对象的垃圾收集

时间:2014-04-26 18:47:57

标签: c# garbage-collection

让我们说我有一个类引用另一个类:

class1
{

}

class2
{
    int A;
    class1 B;

    public class2(int a, class1 b){
        A =a;
        B = b;
    }

现在在另一种方法中我创建了一个新实例:

class3
{
    class2 myobject;

    mymethod()
    {
        class2 myobject = new class2(45, new class1( some parameters));
    }
}

当新class1(某些参数)内存空闲时?

2 个答案:

答案 0 :(得分:5)

  

什么时候释放新创建的class1实例?

不可能肯定地说。垃圾收集器可以在选择时释放它,或者选择永不释放它。

  

可以释放内存的最新内容是什么?

不要求释放内存。该程序可以永远运行,永远不会收集。

  

最早可以释放内存的是什么?

class2的实例分配之后,可以立即释放。鉴于永远不会读取局部变量,因此不需要实际存在局部变量。抖动可以将其优化掉,这意味着class2没有gc根,因此可以立即释放,因此它所持有的class1实例也可以。

更一般地说:虽然你想要了解运行时的工作方式是好的,但不要强调它。 99.99%的时间垃圾收集器完全按照您的意愿完成,而不用考虑它。

答案 1 :(得分:2)

当没有对它的引用并且该对象不能被访问时,垃圾收集器释放一个对象。

编辑: 如上所述 Theodoros Chatzigiannakis ,在垃圾收集器调用对象的终结器之后,该对象符合垃圾的条件 采集。垃圾收集器可以回收这种对象的内存。但我们不知道何时收集它。

垃圾收集器的一个问题是它不能保证它会执行 它在指定时间的任务。因此,垃圾收集器可以调用终结器 在对象变得无法访问之后的时间,并且可以回收任何内存 终结器执行后的时间。事实上,在应用程序终止之前,两者都不可能发生。因此,不清楚终结者是否或何时会被召唤。因此,很少使用终结器。

例如:

classObj obj = new classObj(); 
//we create an new object in memory (by invoking new classObj()) 
//and obj refers to it.

obj = null; 
//now we change obj's reference to null but object 
//that we created in memory still exists