【发布时间】:2012-11-15 03:25:03
【问题描述】:
没有任何 dispose() 或 finalize 模式的 .NET 对象如何被 clr 销毁? 是否被Object Finalize方法清除!
【问题讨论】:
没有任何 dispose() 或 finalize 模式的 .NET 对象如何被 clr 销毁? 是否被Object Finalize方法清除!
【问题讨论】:
不,如果对象没有显式声明终结器,则它永远不会添加到 freachable 队列中 - 它的内存只是被回收。
这是你不应该声明终结器的原因之一,除非你真的需要一个。任何具有终结器的对象都需要两次 GC 才能完全收集。
Object.Finalize什么都不做 默认。它必须被覆盖 仅在必要时派生类, 因为垃圾期间的回收 收集往往需要更长的时间 如果必须运行 Finalize 操作。
另外我建议您查看Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework。
【讨论】:
System.IO.File 类确实实现了一个终结器——它用于关闭文件句柄。此外,当一个类有一个终结器时,它通常实现System.IDisposable。这样你就可以在using statements中使用它。
请参阅此article 以全面了解 Dispose 模式的作用。
在某些情况下,您可能希望为使用对象的程序员提供在垃圾收集器释放对象之前显式释放这些外部资源的能力。如果外部资源稀缺或昂贵,如果程序员在不再使用资源时显式释放资源,则可以获得更好的性能。
【讨论】:
垃圾收集器最终将回收对象使用的内存,因为它不再被任何引用访问。这是唯一会发生的清理,除非对象有终结器。
【讨论】:
将 .net 中的垃圾收集器想象成类似于保龄球馆置瓶机清除“死木”(撞倒的瓶)的方式可能是最简单的:
请注意,在操作的任何阶段,置瓶机都不会检测或瞄准任何被撞倒的瓶。它既不知道也不关心是否有一个这样的瓶或其中九个(如果没有瓶站立,置瓶机将记录一次击球并跳过一帧的后半部分)。从置瓶机的角度来看,这些瓶可能不存在,直到它们到达可以回收它们的机制。
【讨论】: