有一个winforms应用程序,其中几个表单非常复杂 - 使用数据集,多个绑定与网格和组合框架。
每次打开表单时,内存使用量都会增加大约2-5 MB,直到我得到OutOfMemoryException。
我对每个using
使用IDisposable
语句(对于Form
也是如此),试图清除所有绑定并取消订阅我在Dispose()中的事件,没有任何改变。
如果我在处理表单后调用GC.Collect()
,则使用的内存量将返回之前的状态,就像打开表单之前一样。
我尝试了一些内存分析器,但它们并没有显示出任何特别的内容。
答案 0 :(得分:1)
因为内存增长如此之快,问题必须出现在其中一个控件的Paint方法中(如果您自己绘制/绘制控件)或者网格的自动更新循环中(如果更新数据源)定期)。
希望这会有所帮助。如果没有关于源代码的更详细信息,很难提供任何其他帮助。
答案 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',虽然我没试过。