热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Thereisawinformsapplication,wherecoupleofformsareverycomplicated-usingdatasets,multip

There is a winforms application, where couple of forms are very complicated - using datasets, multiple bindings with grids and comboboxes.. Every time when I open the form, the memory usage grows for about 2-5 MB until I get OutOfMemoryException. I use using statements for every IDisposable (for Forms too), tried to clear all the bindings and unsubscribe my events within Dispose(), nothing changed. If I call GC.Collect() after disposing the form, used memory amount returns in previous state, as it was before opening the form. I have tried some memory profilers, but they did not show anything extraordinary.

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

3 个解决方案

#1


1  

Because the memory grows so rapidly, the problem must be in the Paint method of one of the controls (if you paint/draw the control yourself) or in the auto-update loop of your grids (if you update the data source periodically).

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

  1. Check if you dispose all Brushes, Pens, Font, StringFormats in your paint loop.
  2. 检查是否在绘制循环中处理所有画笔,笔,字体,字符串格式。
  3. Check the update-loop of your data sources. Common errors are SqlCommand and SqlConnections which are not disposed properly.
  4. 检查数据源的更新循环。常见错误是SqlCommand和SqlConnections没有正确处理。

Hope this helps. Without more detailed information about your source-code it's hard to provide any other help.

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

#2


1  

It is possible that your DataSet is not released correctly although you dispose it. From MSDN

尽管您处置了DataSet,但可能无法正确释放它。来自MSDN

Note: Classes inherited from DataSet are not finalized by the garbage collector, because the finalizer has been suppressed in DataSet. The derived class can call the ReRegisterForFinalize method in its constructor to allow the class to be finalized by the garbage collector.

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

And you should read this question that can be very usefull Should I Dispose() DataSet and DataTable?

你应该阅读这个非常有用的问题我应该Dispose()DataSet和DataTable吗?

#3


1  

My employer, Red Gate Software, makes a .NET memory profiling tool you could use to investigate your problem. It has a 14-day trial which might be long enough to find your leak for free :)

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

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

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

There is also 'dotTrace Memory' by jetBRAINS, although I've not tried it.

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


推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
author-avatar
u02022042
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有