【问题标题】:Garbage Collection best practice in .net.net 中的垃圾收集最佳实践
【发布时间】:2013-10-02 06:27:23
【问题描述】:

System.GC.CollectDispose() 有什么区别?

它们不是用于相同的目的吗?何时应该使用它们;最佳做法是什么?

【问题讨论】:

标签: c# .net oop garbage-collection


【解决方案1】:

最佳做法是永远不需要调用GC.Collect,并在处理完所有IDisposable 对象后调用Dispose

【讨论】:

  • 或者使用异常安全的using块。
  • 正确,但您没有解决 GC 和 IDisposable 确实服务于相同目的的事实。这两个准则几乎没有关系。
【解决方案2】:

GC.Collect的目的是告诉垃圾收集器内存中有一些对象可以收集,是时候收集了。不过,根据经验,您应该将其留给 GC 本身。它旨在完成这项工作。

如果您的对象中有一些您认为 GC 不会处理的资源。您应该自己实施 Dispose 和处理它们。你需要调用 Dispose Explicitly 来释放你想要的资源。如果您正在实现 IDisposable,那么您也可以通过 Using 语句来实现。

【讨论】:

  • Ehsan 的建议似乎是正确的。我有一个案例,我们迭代地通过性能关键部分,然后暂停。在暂停期间,我们调用 GC.Collect 以避免系统选择在性能关键部分中间进行收集。这似乎是 GC.Collect 的一个合适用例。
【解决方案3】:

System.GC.Collect 在内存中的所有对象都将被垃圾收集器收集时调用。垃圾收集不考虑托管代码中引用的对象。该方法用于强制系统回收可用内存。

Dispose() 不是 GC 的一部分,但作为更好的做法,您可以使用它。它应该只用于使用非托管资源(如 FileStream 等)的对象。它应该释放它拥有的所有资源。当您知道某些资源不会被 GC 释放时,您可以使用 Dispose() 方法。

using 语句确保正确使用 IDisposable 对象。

附带说明: GC 不调用 Dispose,它调用终结器(您应该从 Dispose(false) 调用它)

另外,为了确保资源总是被适当地释放,Dispose 方法应该可以多次调用而不抛出异常。


MSDN 说:

"可以通过调用Collect来强制进行垃圾回收,但是 大多数情况下,应该避免这种情况,因为它可能会产生 性能问题。 "

检查这个blog:-

GC.Collect() 要求系统“现在”执行收集。你 不应该惹这个;系统通常有一个更好的主意 比你什么时候需要收集。

最佳做法是:

您可以使用 using 块,也可以使用您提到的 Dispose 方法。

为什么要使用 IDisposable 和 Dispose?

MSDN

在许多情况下,原本总是 需要最终确定以避免通过实施 IDisposable 接口。该接口提供了另一种方法 用于回收其生命周期众所周知的资源 程序员,这实际上发生了很多。当然是 如果您的对象仅使用内存,则更好,因此 根本不需要最终确定或处置;但如果最终确定是 有必要,并且在很多情况下,显式管理您的 objects 简单实用,然后实现 IDisposable 接口是避免或至少减少终结的好方法 费用。

也可以在Improve garbage collector performance using finalize/dispose pattern查看这篇文章

【讨论】:

  • (几乎)永远不要使用析构函数。
  • @HenkHolterman:- 删除了 Destructor 部分,因为我认为这具有误导性!这会让我的答案更好吗?
  • 是的,但不是我的 -1。
  • @HenkHolterman:- 好的...不是问题,先生。可能Destructor也误导了别人! :)
  • 关于您的评论:那已经过时了。如果您有非托管资源,请将其包装在 SafeHandle 中。不需要析构函数。
猜你喜欢
  • 2017-04-07
  • 2013-08-24
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多