Windows窗体应用程序内存泄漏.NET

时间:2013-06-19 11:22:40

标签: c# .net winforms memory-leaks

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

3 个答案:

答案 0 :(得分:1)

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

  1. 检查您是否在绘制循环中处理所有画笔,笔,字体,字符串格式。
  2. 检查数据源的更新循环。常见错误是SqlCommand和SqlConnections未正确处理。
  3. 希望这会有所帮助。如果没有关于源代码的更详细信息,很难提供任何其他帮助。

答案 1 :(得分:1)

尽管您处置DataSet,但{{1}}可能无法正确发布。 来自MSDN

  

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

你应该阅读这个非常有用的问题Should I Dispose() DataSet and DataTable?

答案 2 :(得分:1)

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

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

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