GC,Finalize()和Dispose之间是什么关系?

GC,Finalize()和Dispose之间是什么关系?,第1张

GC,Finalize()和Dispose之间是什么关系?

GC是垃圾回收。它是自动内存管理,用于处理托管堆上分配的对象的清除。.NET
GC使用标记和清除算法。发生垃圾收集时,它基本上将堆中要清除的所有对象视为可恢复。然后,它经过标记过程,在其中扫描根。即,它标识应用程序仍在使用的对象。完成后,其余对象就有资格进行清理。堆可以作为清理的一部分进行压缩。

处置和终结处理方法都提供了清理资源的选项,这些资源 不是 由GC处理的。例如,这可能是本机句柄等。它们与回收托管堆上的内存无关。

必须在实现的类型上显式调用Dispose

IDisposable
。可以通过
Dispose()
方法本身或通过
using
构造来调用它。GC不会自动调用Dispose。

另一方面,终结器或析构函数(如语言规范所称)将在对象符合清除条件的 某个 时间自动被调用。Finalize方法在专用线程上顺序执行。

Dispose()
允许确定性地清理资源,而终结器可以作为安全网,以防用户不打电话
Dispose()

如果类型实现了终结器,则实例的清理会延迟,因为必须在清理之前调用终结器。也就是说,将需要额外的收集来回收该类型实例的内存。如果类型也实现IDisposable,则可以调用Dispose方法,然后实例可以将其自身从终结处理中移除。这将允许清除对象,就好像它没有终结器一样。

如果您想深入研究这一点,我建议使用Jeffrey
Richter的C#进行CLR
。这是一本很棒的书,它涵盖了本书的所有细节(我省略了许多细节)。新的第三版刚刚发布。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5440803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存