为什么GC不收集未使用的对象

时间:2016-03-10 20:12:55

标签: c# garbage-collection c#-6.0

我正在尝试理解当一个对象不再被使用时GC是如何动作的,我的测试是对对象做任何事情(在使用之后)但它没有用,但对象的析构函数从未被调用。 / p>

我创建了一个示例程序,试图等到对象被销毁,但是运行4小时后没有任何事情发生。

注意:我知道如果我将对象设置为null,GC将收集它,但我只想看到GC本身收集对象的“正常”方式。

S → ( S ) S
|   .

2 个答案:

答案 0 :(得分:3)

GC不会以确定的方式收集免费资源。该程序应该需要内存来询问资源。如果有足够的资源,GC将不会收集任何东西,因为没有必要。此外,GC只能在程序“空闲”状态下收集内存......

我强烈建议您阅读:Understanding .NET Garbage Collection

正如您可以在文档中测试和查看,即使调用GC.Collect()

也无法强制执行垃圾回收

GC.Collect documentation

除此之外,您还需要了解根据平台和CLR实现有一些GC风格

Cross-VM Object Collections

出于测试目的,您可以使用GC.AddMemoryPressure Method (Int64)

增加收集内存的需求

答案 1 :(得分:1)

GC 收集对象,但仅限于发布模式。

在调试模式下,变量result将存在,只要它在范围内,即使您不使用它,以便调试器可以继续向您显示其值。但这也意味着对象不能被垃圾收集。

在发布模式下,.Net非常聪明,可以意识到该对象不再被使用,因此它有资格进行垃圾回收。当调用GC时(在你的情况下通过调用GC.Collect()显式),它将收集它。