处理部署中的成员以控制内存使用

时间:2014-12-12 08:59:07

标签: c# memory-management dispose

对象列表A保存在缓存中。在某一点上传递这些对象并使用AB的属性。 B是一种大型数据结构。 A需要保留在缓存中,但在某个时间点B不是必需的 - 因为它很大,我们想让它被垃圾收集。

设置Dispose的A上的A.B=null方法是否允许垃圾收集器收集该对象,如果没有其他内容保存对B的引用(即我们将在{{1}上调用Dispose当我们不再需要A时,或者可以使用using语句来实现相同的效果)。

在这种情况下,Dispose用于控制托管对象的生命周期,即可以通过CG释放它。

1 个答案:

答案 0 :(得分:1)

Dispose是始终用于控制托管对象的生命周期 - 在调用dispose之后访问对象是一个坏主意,如果你这样做,许多BCL对象将抛出异常。没有引用对象是垃圾收集的先决条件,但GC足够智能来检测图形。

例如,如果A是孤儿而且 else 没有任何对B的引用,那么也会收集B.另一方面,如果其他东西持有对B的引用,则A不是孤儿,也不会被收集。

取消引用并不强制进行垃圾回收,也不应该强制进行垃圾回收。垃圾收集器非常智能,只有在存在实际内存压力时才能运行集合,因为解除分配是很昂贵的。

<强>更新

看起来真正的问题是&#34;如果我想在没有实际释放A的情况下释放AB,可以通过调用A.Dispose()来做到这一点吗?答案是&#34;不,从未&#34;

A.Dispose表示A对所有意图和目的都是死的。最好添加一个名为A.CloseB()的方法,实际调用B.Dispose()然后将其设置为null,并让GC在必要时收集它。