2

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

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

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

PS:我意识到这个话题有很多困惑,所以如果我在我的问题中犯了错误,请随时纠正我。但大多数情况下,我想把这个例外排除在外。

编辑

好吧,奇怪的事情发生了。我将整个项目从我的桌面(它不起作用)复制到我的笔记本电脑上。显然,它在我的笔记本电脑上运行良好!内存只增加了 500 KBps,并在 1 秒后自动释放。我不知道为什么,它是完全相同的项目,并且没有更改任何代码。

有谁知道为什么会这样?

4

5 回答 5

1

在using 语句中使用这些变量并在完成后调用GC.Collect()

于 2012-11-19T09:12:23.867 回答
1

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

于 2012-11-19T09:51:12.757 回答
1

以我的经验,在托管代码中泄漏内存的最常见方法是长时间持有引用,或者没有意识到如何处理引用。实时引用将阻止垃圾收集,无论您的代码如何处理内容。

是一篇关于如何找出泄漏的内容以及这些引用在哪里的不错的文章,您可能还想阅读“附加背景”链接。

于 2012-11-19T09:27:28.983 回答
0

也许您的对象应该实现 IDisposable 以便您可以在不再需要它们时清理资源。这篇 MSDN 文章展示了如何实现它:

深入研究 IDisposable

于 2012-11-19T09:13:39.890 回答
0

可能这个讨论将帮助您了解.net Finalize/Dispose 模式在 C# 中的内存管理实际发生了什么

以防万一,这是关于如何处理对象的另一篇文章:使用 dispose/finalize 模式释放套接字/事件/ummaged 代码的正确技术

于 2012-11-19T09:12:38.037 回答