我可以在C#中强制清理内存吗?

时间:2009-12-05 18:00:55

标签: c# .net memory-management

我听说即使你已经完成它,C#也不会马上释放内存。我可以强制C#释放内存吗?

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

P.S。我没有遇到C#的问题以及它如何管理内存。我只是好奇。

5 个答案:

答案 0 :(得分:19)

吉姆,

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

GC.Collect();

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

编辑1:“强制”在引号中。更明确的另一张海报是,这真的只是暗示它。你无法在特定的时间点实现它。因此,链接到.Net

中关于垃圾收集的文章

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

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

答案 1 :(得分:9)

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

取消分配未引用的对象
System.GC.Collect();

有一个方法WaitForPendingFinalizers将“暂停当前线程,直到处理终结器队列的线程清空该队列”。虽然你不需要打电话。

正如其他人建议前往MSDN获取更多信息。

答案 2 :(得分:3)

您可能需要查看InfoQ.com上的 screencast^ 。它展示了.NET Garbage Collector

的内部结构

答案 3 :(得分:2)

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

收集未引用的对象
GC.Collect()

方法。文档为here

答案 4 :(得分:0)

您可以通过以下两种方法清理记忆:

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

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