我有一个非常基本的问题。
我写了一个这样的循环:
while(true)
{
MyTestClass myObject = new MyTestClass();
}
myObject = null;
怎么办?答案 0 :(得分:10)
myObject
是变量 - 在堆栈上有一个固定的位置供参考;但是,每个new MyTestClass()
是一个不同的对象,在可用堆空间的某处创建;每次都不同while
如何实际实现 - 但这只会在退出循环后显示。因为在每次迭代中你都会立即分配它,所以答案 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
都将分配给新地址。所以这个循环所做的就是为单个变量名分配新的内存地址。因此:
答案 4 :(得分:0)
作为所有其他答案的补充:
你可以让你的类成为一个结构。然后它将在堆栈上并在每次迭代时被丢弃。如果您的结构创建了新类,那么您将回到原点。如果你的结构很大,它可能会对性能产生负面影响,但如果它很小,它可能会对性能产生积极影响。