【问题标题】:Can I force memory cleanup in C#?我可以在 C# 中强制进行内存清理吗?
【发布时间】:2010-12-23 14:25:46
【问题描述】:

我听说 C# 不会立即释放内存,即使你完成了它。我可以强制 C# 释放内存吗?

我正在使用 Visual Studio 2008 Express。这有关系吗?

附:我对 C# 以及它如何管理内存没有问题。我只是好奇。

【问题讨论】:

  • 停止它。别。不要管它。你不敢。不,不是你的。走开,想点别的。
  • @Will。他摸过痛处了吗?
  • @Charles,如果你有一个长时间运行的服务,或者 SQL 中的 CLR 函数——一个处理大量文本的函数——在一个 24x7 的服务器环境中,你将需要这样做。 .. 它不应该随意进行,因为它是一项昂贵的操作,但是偶尔需要。
  • IIRC GC.Collect 将获取所有应被收集的对象并将它们提升到下一代,它们不太可能下次收集。
  • @Jason D:我发现你声称你需要这样做相当大胆。我编写了长期运行的 24x7 服务,这些服务根本不需要。您在哪里以及为什么找到需求?

标签: c# .net memory-management


【解决方案1】:

吉姆,

你没听错。它通过称为垃圾收集器的机制定期清理内存。您可以通过如下调用“强制”垃圾收集。

GC.Collect();

我强烈建议你阅读this MSDN article on garbage collection

编辑 1:“Force”用引号引起来。更清楚的是另一张海报是,这真的只是暗示它。你不能真正让它在特定的时间点发生。因此链接到 .Net 中关于垃圾收集的文章

编辑 2:我意识到这里的每个人都只对您的主要问题提供了直接答案。至于你的第二个问题。使用 Visual Studio 2008 Express 仍将使用执行垃圾收集的 .net 框架。因此,如果您升级到专业版,您仍将拥有相同的内存管理功能/限制。

编辑 3:This wikipedia aritcles on finalizers 给出了一些关于在终结器中适合做什么的很好的指示。基本上,如果您正在创建一个可以访问关键资源的对象,或者您正在使用这样的对象,请实现 IDispose 和/或利用 using 语句。即使抛出异常,使用也会自动调用 Dispose 方法。这并不意味着您不需要给运行终结器提示...

【讨论】:

  • 谢谢。那里有很多信息。好文章,尤其是。因为我来自 C++ 背景。
【解决方案2】:

您不能强制 C# 释放内存,但您可以请求 CLR 通过调用释放未引用的对象

System.GC.Collect();

有一种方法WaitForPendingFinalizers 将“暂停当前线程,直到正在处理终结器队列的线程清空该队列”。虽然你不应该调用它。

正如其他人建议的那样,前往MSDN 了解更多信息。

【讨论】:

【解决方案3】:

您可能想看看这个来自 InfoQ.com 的 screencast^。它展示了.NET Garbage Collector 的内部结构。

【讨论】:

    【解决方案4】:

    你可以强制垃圾收集器通过

    GC.Collect()
    

    方法。文档是here

    【讨论】:

      【解决方案5】:

      你可以通过两种方法清理你的内存:

      GC.Collect();
      GC.WaitForPendingFinalizers();
      

      阅读参考GC.Collect()GC.WaitForPendingFinalizers()

      【讨论】:

      • 这真的有效吗?有人试过吗?或者这是一个被当作真相流传的都市传说?
      猜你喜欢
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多