在释放中清空成员以控制内存使用情况
本文关键字:内存 用情 情况 控制 释放 清空 成员 | 更新日期: 2023-09-27 18:34:00
缓存中保存A
对象的列表。 在某一时刻,这些对象被传递并使用A
、B
的属性。 B 是大型数据结构。 A
需要保存在缓存中,但在某个时候B
不是必需的 - 因为它很大,我们希望让它被垃圾回收。
没有其他方法包含对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 收集它。