我正在尝试理解当一个对象不再被使用时GC是如何动作的,我的测试是对对象做任何事情(在使用之后)但它没有用,但对象的析构函数从未被调用。 / p>
我创建了一个示例程序,试图等到对象被销毁,但是运行4小时后没有任何事情发生。
注意:我知道如果我将对象设置为null,GC将收集它,但我只想看到GC本身收集对象的“正常”方式。
S → ( S ) S
| .
答案 0 :(得分:3)
GC不会以确定的方式收集免费资源。该程序应该需要内存来询问资源。如果有足够的资源,GC将不会收集任何东西,因为没有必要。此外,GC只能在程序“空闲”状态下收集内存......
我强烈建议您阅读:Understanding .NET Garbage Collection
正如您可以在文档中测试和查看,即使调用GC.Collect()
除此之外,您还需要了解根据平台和CLR实现有一些GC风格
出于测试目的,您可以使用GC.AddMemoryPressure Method (Int64)
增加收集内存的需求答案 1 :(得分:1)
GC 将收集对象,但仅限于发布模式。
在调试模式下,变量result
将存在,只要它在范围内,即使您不使用它,以便调试器可以继续向您显示其值。但这也意味着对象不能被垃圾收集。
在发布模式下,.Net非常聪明,可以意识到该对象不再被使用,因此它有资格进行垃圾回收。当调用GC时(在你的情况下通过调用GC.Collect()
显式),它将收集它。