C# - 在块结束时自动释放内存

时间:2012-11-19 09:08:51

标签: c# memory out-of-memory

所以我有一个程序,每秒增加5MB的内存。由于每个应用程序只能分配2GB,因此我在启动程序后大约5分钟达到了极限,并获得了System.OutOfMemoryException。

我已经完成了我的作业" (希望足够好:D)并且知道在块结束后,该块中的变量不会被处理掉。

最终,我需要一种方法来自动从每个块之后使用的变量中释放内存,以阻止OutOfMemoryException的发生。

P.S。:我意识到这个话题有很多混乱,所以如果我在我的问题上犯了错误,请随时纠正我。但大多数情况下,我希望将此异常排除在外。

修改

好的事发生了。我将整个项目从我的桌面(它不起作用)复制到我的笔记本电脑上。显然,它在我的笔记本电脑上运行得很好!内存仅将MOSTLY增加500 KBps,并在1秒后自动释放。我不知道为什么,它完全是同一个项目,没有代码被改变。

任何人都知道为什么会这样吗?

5 个答案:

答案 0 :(得分:1)

using statement中使用这些变量,完成后调用GC.Collect()

答案 1 :(得分:1)

根据我的经验,在托管代码中泄漏内存的最常见方法是持续引用太长时间,或者没有意识到如何处理引用。无论你的代码处理得多好,实时引用都会阻止垃圾收集。

Here是一篇很好的文章,介绍了如何找出泄漏的内容以及这些引用的位置,您可能还想阅读“其他背景”链接。

答案 2 :(得分:1)

使用ANTS探查器或CLRProfiler确定哪些对象占用空间以及哪些方法正在创建并保留引用这些对象。

答案 3 :(得分:0)

可能此讨论将帮助您了解.net Finalize/Dispose pattern in C#

中有关内存管理的实际情况

以防万一,这是关于如何处置对象的另一篇文章:the correct technique for releasing a socket/event/ummaged code with the dispose/finalize pattern

答案 4 :(得分:0)

也许您的对象应该实现IDisposable,这样您就可以在不再需要时清理资源。这篇MSDN文章介绍了如何实现它:

Digging into IDisposable