在无限循环中创建的对象的垃圾收集

时间:2010-07-08 09:59:36

标签: c# garbage-collection

我有一个非常基本的问题。

我写了一个这样的循环:

while(true)
{
   MyTestClass myObject = new MyTestClass();
}
  1. 什么时候会创建对象 循环,垃圾收集?
  2. 此外,对于每次迭代,都是 新的内存位置是 分配给myObject引用?
  3. 如果我在每次迭代结束时写myObject = null;怎么办?

5 个答案:

答案 0 :(得分:10)

  1. 每当GC感觉像这样,坦白说;永远不会读取变量,因此它始终符合条件
  2. myObject变量 - 在堆栈上有一个固定的位置供参考;但是,每个new MyTestClass()是一个不同的对象,在可用堆空间的某处创建;每次都不同
  3. 没有任何区别;严格来说,有一些复杂性涉及变量的实际声明点(在IL中)以及while如何实际实现 - 但这只会在退出循环后显示。因为在每次迭代中你都会立即分配它,所以
  4. 有形的区别

答案 1 :(得分:5)

  

什么时候会在循环中创建对象,垃圾收集?

在删除最后一次引用之后的某个时刻。在每次循环迭代中创建并删除新引用,因此GC可以在需要时自由地收集这些对象。实际上,当你的程序完全填满零代时,很可能会发生这种情况。

  

此外,对于每次迭代,是否将新内存位置分配给myObject引用?

  

如果我在每次迭代结束时写myObject = null;怎么办?

它不会有任何区别。设置myObject = null;会删除对该对象的引用,但是在下一次循环迭代中重新分配myObject变量时,无论如何都会删除引用。

答案 2 :(得分:4)

让我们添加一些实际使用该对象的代码,使其更加清晰:

while(true) {
  // Here a new instance is created in each iteration:
  MyTestClass myObject = new MyTestClass();
  // Here the instance is still in use
  // until here:
  myObject.CallSomething();
  // Here the instance isn't used any more,
  // so the GC can collect it if it wants to.
  // Setting the reference to null here:
  myObject = null;
  // is useless, as the GC already knows that the
  // instance is unused before that time.
}

答案 3 :(得分:3)

让我们清楚一些事情。每次进入循环内部时,myObject都将分配给新地址。所以这个循环所做的就是为单个变量名分配新的内存地址。因此:

  1. GC将垃圾收集所有以前的分配,可能几乎是立即,因为变量从未使用过。
  2. 没关系。该变量仍未使用。

答案 4 :(得分:0)

作为所有其他答案的补充:

你可以让你的类成为一个结构。然后它将在堆栈上并在每次迭代时被丢弃。如果您的结构创建了新类,那么您将回到原点。如果你的结构很大,它可能会对性能产生负面影响,但如果它很小,它可能会对性能产生积极影响。