在释放中清空成员以控制内存使用情况



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

如果 A 上

没有其他方法包含对B的引用,则 A 上的 Dispose 方法是否设置A.B=null使垃圾收集器能够收集该对象(即,当我们不再需要B时,我们将在A上调用 Dispose ,或者可以使用 using 语句来实现相同的效果(。

在这种情况下,Dispose 用于控制托管对象的生存期,即何时可以被 CG 释放。

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

例如,如果 A 是孤立项,并且没有其他任何内容包含对 B 的引用,则也会收集 B。另一方面,如果其他东西引用了B,那么A就不是真正的孤儿,不会被收集。

清空引用不会强制垃圾回收,也不应尝试强制垃圾回收。垃圾回收器足够智能,只有在存在实际内存压力时才运行收集,因为释放成本很高。

更新

似乎实际的问题是"如果我想在不实际发布A的情况下释放A.B,可以通过调用A.Dispose((来做到这一点吗?"答案是"不,永远不会"。

A.Dispose意味着A已经死了。最好添加一个名为 A.CloseB() 的方法,该方法实际调用B.Dispose()然后将其设置为 null,并在必要时让 GC 收集它。

最新更新