0

有一个 winforms 应用程序,其中几个表单非常复杂 - 使用数据集、与网格和组合框的多个绑定。每次打开表单时,内存使用量都会增长大约 2-5 MB,直到我得到 OutOfMemoryException。我using为每个IDisposableForm也为 s)使用语句,试图清除所有绑定并在 Dispose() 中取消订阅我的事件,没有任何改变。如果我GC.Collect()在处理表单后调用,使用的内存量将返回以前的状态,就像打开表单之前一样。我尝试了一些内存分析器,但它们并没有显示出任何异常。

4

3 回答 3

1

我的雇主 Red Gate Software 制作了一个 .NET 内存分析工具,您可以使用它来调查您的问题。它有一个 14 天的试用期,这可能足以免费找到您的泄漏 :)

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/

jetBrains 也有 'dotTrace Memory',虽然我没试过。

于 2013-06-19T11:57:42.270 回答
1

因为内存增长得如此之快,所以问题一定出在其中一个控件的 Paint 方法中(如果您自己绘制/绘制控件)或在您的网格的自动更新循环中(如果您定期更新数据源)。

  1. 检查您是否在绘制循环中处理所有画笔、钢笔、字体、字符串格式。
  2. 检查数据源的更新循环。常见错误是未正确处理的 SqlCommand 和 SqlConnections。

希望这可以帮助。如果没有有关您的源代码的更多详细信息,就很难提供任何其他帮助。

于 2013-06-19T11:31:35.900 回答
1

尽管您处理了它,但您可能DataSet没有正确释放它。来自MSDN

注意:从 DataSet 继承的类不会被垃圾收集器终结,因为终结器在 DataSet 中已被抑制。派生类可以在其构造函数中调用ReRegisterForFinalize方法,以允许垃圾收集器终结该类。

你应该阅读这个非常有用的问题,我应该 Dispose() 数据集和数据表吗?

于 2013-06-19T11:51:53.650 回答