.NET 中的垃圾回收最佳做法
本文关键字:最佳 NET | 更新日期: 2023-09-27 18:33:29
System.GC.Collect
和Dispose()
有什么区别?
它们不是用于相同的目的吗,何时应该使用它们;最佳实践是什么?
最佳做法是永远不需要调用 GC.Collect
,并在处理完所有对象后对所有IDisposable
对象调用 Dispose
。
GC 的目的。收集是告诉垃圾回收器内存中有一些对象可以收集,这是收集的正确时间。但是,根据经验,您应该将其留给GC本身。它旨在完成这项工作。
如果对象中有一些您认为 GC 不会处理的资源。您应该实现"处置"并自行处理它们。需要调用显式释放来释放所需的资源。如果你正在实现 IDisposable,你也可以通过 Using 语句来做到这一点。
当垃圾回收器要收集内存中的所有对象时,将调用System.GC.Collect。在托管代码中引用的对象不考虑用于垃圾回收。此方法用于强制系统回收可用内存。
Dispose(( 不是 GC 的一部分,但作为更好的实践,您可以使用它。它应该只用于使用非托管资源(如FileStream等(的对象。它应该释放它拥有的所有资源。当您知道某些资源不会被 GC 释放时,您可以使用 Dispose(( 方法。
using 语句可确保正确使用可识别的对象。
附带说明:GC 不调用 Dispose,它调用终结器(您应该从 Dispose(false(( 调用(
此外,为了确保始终适当地释放资源,Dispose 方法应该可多次调用而不会引发异常。
MSDN 说:
"可以通过调用 Collection 来强制垃圾收集,但是 大多数情况下,应避免这种情况,因为它可能会产生 性能问题。'">
查看此博客:-
气相色谱。Collect(( 要求系统"现在"执行一个收集。你 不应该搞砸这个;系统通常有一个更好的想法 比你什么时候需要收集。
最佳实践也是如此:
您可以使用 using 块,也可以如前所述使用 Dispose 方法。
为什么要使用 IDisposable 和 Dispose?
MSDN 说
在许多情况下,对象可能总是 需要最终确定以避免通过实施 可识别的接口。此接口提供了一种替代方法 用于回收其生存期为众所周知的资源 程序员,这实际上经常发生。当然是 如果您的对象仅使用内存,则更好,因此 根本不需要最终确定或处置;但如果最终确定 必要,并且在许多情况下显式管理您的 对象既简单又实用,然后实现 IDisposable 接口是避免或至少减少终结的好方法 成本。
另请查看这篇关于使用最终/释放模式提高垃圾回收器性能的文章