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

C# Windows窗体应用程序内存泄漏.NET,c#,.net,winforms,memory-leaks,C#,.net,Winforms,Memory Leaks,有一个winforms应用程序,其中有两个表单非常复杂-使用数据集、网格和组合框的多个绑定。。 每次打开表单时,内存使用量都会增加大约2-5MB,直到我退出MemoryException。 我对每个IDisposable(也适用于表单)使用using语句,试图清除所有绑定并取消订阅Dispose()中的我的事件,但未发生任何更改。 如果我在处理表单后调用GC.Collect(),则已用内存量将返回以前的状态,就像打开表单之前一样。 我尝试过一些内存分析器,但它们没有显示任何异常。因为内存增长如此

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

因为内存增长如此之快,问题一定是某个控件的绘制方法(如果您自己绘制/绘制控件)或网格的自动更新循环(如果您定期更新数据源)

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

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

    因为内存增长如此之快,问题一定是某个控件的绘制方法(如果您自己绘制/绘制控件)或网格的自动更新循环(如果您定期更新数据源)

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

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

    尽管您处理了数据集,但它可能没有正确发布。 从

    注意:从DataSet继承的类不会由垃圾处理完成 收集器,因为终结器已在数据集中被抑制。这个 派生类可以在其 构造函数来允许垃圾处理程序最终确定类 收藏家


    您应该阅读这个非常有用的问题

    您的
    数据集
    可能没有正确发布,尽管您已经处理了它。 从

    注意:从DataSet继承的类不会由垃圾处理完成 收集器,因为终结器已在数据集中被抑制。这个 派生类可以在其 构造函数来允许垃圾处理程序最终确定类 收藏家


    你应该阅读这个非常有用的问题

    我的雇主,红门软件公司,制造了一个.NET内存分析工具,你可以用来调查你的问题。它有14天的试用期,可能足够长,可以免费找到你的漏洞:)


    jetBRAINS也有“dotTrace Memory”,尽管我还没有尝试过。

    我的雇主,RedGate软件,制造了一个.NET内存分析工具,你可以用来调查你的问题。它有14天的试用期,可能足够长,可以免费找到你的漏洞:)


    jetBRAINS还提供了“dotTrace Memory”,尽管我没有尝试过。

    您正在缓存数据吗?您是否尝试过在探查器中拍摄快照以查看哪些资源未被清除?这可能会给你一个方向我想我没有缓存任何数据。。我已经拍摄了一周的内存快照并对其进行了分析,没有发现任何可能表明内存泄漏的内容。打开表单时加载了多少数据?在快照之间,您是否看到内存的差异?在什么地方?当然,如果内存不足,应该在快照(可能在非托管资源中)中反映异常。是否正在缓存数据?是否尝试在探查器中进行快照以查看哪些资源未清除?这可能会给你一个方向我想我没有缓存任何数据。。我已经拍摄了一周的内存快照并对其进行了分析,没有发现任何可能表明内存泄漏的内容。打开表单时加载了多少数据?在快照之间,您是否看到内存的差异?在什么地方?当然,如果内存不足,应该在快照(可能在非托管资源中)中反映异常。我认为这些是合理的建议。然而,OP说他确实做了所有这些事情。瑟福:我认为内存分析器是一个不错的选择。如果它没有显示结果,那么它肯定没有被有效地使用。每个开发人员都认为他在任何地方都使用了IDisposable。但特别是在绘画方面,你很容易错过一些。但是你是对的,使用诸如NetMemoryProvider、CLRProfiler或Yourkit.NET探查器之类的探查器,你会发现问题所在。我认为这些都是合理的建议。然而,OP说他确实做了所有这些事情。瑟福:我认为内存分析器是一个不错的选择。如果它没有显示结果,那么它肯定没有被有效地使用。每个开发人员都认为他在任何地方都使用了IDisposable。但特别是在绘画方面,你很容易错过一些。但是您是对的,使用诸如NetMemoryProvider、CLRProfiler或Yourkit.NET探查器之类的探查器会发现问题。