【发布时间】:2014-06-11 02:41:57
【问题描述】:
如果我有这样的循环:
public class Foo {
public Foo Foo;
public Foo() {
}
}
class Program {
public static void Main(string[] args) {
var foo = new Foo();
long i = 0;
while(i < Int64.MaxValue) {
foo.Foo = new Foo();
foo = foo.Foo;
if(i % 10000 == 0)
GC.Collect();
i++;
}
GC.Collect();
}
}
垃圾回收器在循环退出之前不会清理父对象。这是为什么?一旦重新分配foo,我看不到任何从代码中引用它们的方法,所以不应该清理它们吗?
在通过我设置的一些断点后,我正在查看任务管理器中进程的内存使用情况,以确定这种情况正在发生。它在循环内不断上升(如果我让它无限,最多可达数 GB),但当循环退出并调用第二个 GC.Collect() 时立即下降。
【问题讨论】:
-
什么是“父对象”?
-
“在循环退出之前,垃圾收集器不会清理父对象”:您能在问题中描述您是如何进行这些观察的吗?
-
@quantdev 我编辑了这个问题。
-
我知道这不是你的真实代码,但为什么不直接使用
foo = new Foo()而不是分配给foo.Foo?顺便说一句,Public Foo Foo;无法编译。 -
您在任务管理器中查看的列的名称是什么?
标签: c# .net garbage-collection