【发布时间】:2011-05-17 22:15:44
【问题描述】:
我正在使用由 IdeaBlade 和 DevExpress 构建的 WinForms 应用程序......在我看来,DevExpress 控件正在导致对象在内存中持久存在。我正在尝试找出阻止垃圾收集器移除的原因,但收效甚微。
谁能推荐一款分析应用程序,该应用程序擅长查找哪些处理程序等在内存中保存项目?
我使用过 AQTime 7 Pro 和 .Net Memory Profiler,但它们似乎都没有明确导致问题的原因。
干杯!
【问题讨论】:
-
你能指定什么DevExpress控件和什么对象吗?它们是否连接到 DevExpress 控件?您是否尝试过添加 Finalize() 覆盖以查看对象是否实际上正在离开内存?
-
@minitech - 在这个阶段,我只关注 DevExpress.XtraGrid.GridControl,但使用任何 DevExpress 控件或对象的每个表单都有相同的问题。我注意到的是,使用此控件打开表单会增加约 4mb 的内存使用量。当您退出窗体时,不会释放内存。再次打开表单会增加 4 mb 的内存。使用 AQtime 7 Pro 查看它显示了表单、控件和 xtragrid 绑定管理器仍然是内存中的对象,但它没有解释是什么将它们保存在那里。看来 DevExpress 可能是问题所在。
-
您可能需要注意,.NET 垃圾收集器可以在任意时间收集未使用的内存,通常是当它感觉需要额外的内存或您的应用程序长时间空闲时,等等实际上可能没有任何问题。尝试创建数千个表单,在每次创建后记录内存使用情况,并查看是否有任何下降。如果有,您可能没有任何问题。 DevExpress 控件可能只是加载大量共享资源,例如图像等。
-
@minitech 是的,我知道,内存不时被释放,但总体而言,应用程序膨胀。在几个小时的认真使用中,它的内存从 150mb 增加到 700mb。您可以坐在那里一遍又一遍地打开/关闭同一个表单,并且永远不会释放内存。
-
我的意思是尝试以编程方式。如果你有很多内存,它可能不会释放,或者某些情况可能会减慢 GC。