GC是垃圾回收。它是自动内存管理,用于处理托管堆上分配的对象的清除。.NET
GC使用标记和清除算法。发生垃圾收集时,它基本上将堆中要清除的所有对象视为可恢复。然后,它经过标记过程,在其中扫描根。即,它标识应用程序仍在使用的对象。完成后,其余对象就有资格进行清理。堆可以作为清理的一部分进行压缩。
处置和终结处理方法都提供了清理资源的选项,这些资源 不是 由GC处理的。例如,这可能是本机句柄等。它们与回收托管堆上的内存无关。
必须在实现的类型上显式调用Dispose
IDisposable。可以通过
Dispose()方法本身或通过
using构造来调用它。GC不会自动调用Dispose。
另一方面,终结器或析构函数(如语言规范所称)将在对象符合清除条件的 某个 时间自动被调用。Finalize方法在专用线程上顺序执行。
Dispose()允许确定性地清理资源,而终结器可以作为安全网,以防用户不打电话
Dispose()。
如果类型实现了终结器,则实例的清理会延迟,因为必须在清理之前调用终结器。也就是说,将需要额外的收集来回收该类型实例的内存。如果类型也实现IDisposable,则可以调用Dispose方法,然后实例可以将其自身从终结处理中移除。这将允许清除对象,就好像它没有终结器一样。
如果您想深入研究这一点,我建议使用Jeffrey
Richter的C#进行CLR。这是一本很棒的书,它涵盖了本书的所有细节(我省略了许多细节)。新的第三版刚刚发布。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)