2009-11-12 51 views
0

我正在追踪MDI应用程序内的内存泄漏。打开,然后关闭窗体,将窗体留在内存中。使用Ant的内存分析器,我可以得到下面的图形保存内存中的形式。内存泄漏/形式不被垃圾收集

当Dispose触发窗体时,我已经删除了任何和所有附加到组合控件的事件。

任何人都可以指导我解决问题吗?

C1命名空间来自ComponentOne。

我应该注意到,我试图看看C1Combo控件上的c,r,b等方法是通过反射器实现的,但它显然是通过一个让事情变得难以理解的obfusticator运行的。

Ant's Reference Graph

回答

0

将其跟踪到C1Combo中控件的内部引用。有一个列表出于某种原因提及了表格和其他一些内容。在窗体上的Dispose()中,我针对每个C1Combo控件调用此函数。不知道后果,可能最小,因为控制权应该被处置。

它也非常脆弱,就好像它们发布了一个新版本,并且所有方法/字段名称混淆在一起,它就会中断。

private void RemoveInternalC1ComboReferenceListHack(C1Combo combo) 
    { 
     var result = typeof(C1Combo).GetField("_dropDownList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(combo); 
     var result2 = result.GetType().GetField("c", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result); 
     var result3 = result2.GetType().GetField("r", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result2); 
     var result4 = result3.GetType().GetField("b", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result3); 

     ((System.Collections.Generic.List<Control>)result4).Clear(); 
    } 
1

C1可能具有通过不释放内部基准中的错误。 Contact the company or search their knowledgebase

对于不同的第三方组件,我记得Telerik控制有我们报告过的错误,并且这些东西在下一个版本中修复 - 有时他们提供了一个即时的解决方法。

2

这让我想起我在1.1年前基于.NET构建的一个巨大的C#WinForm应用程序。我用.NET Memory Profiler,男孩帮我找到寄生虫。蚂蚁的MP可能可以这样做。

无论如何,在我的情况下,我在使用过程中创建了很多并行线程和定时器。罪魁祸首原来是一个计时器实例,它从未妥善处理过,因此永远不会结束定时器运行的衍生线程。

不是我可以直接给你提供答案,但是如果你碰巧有线程产卵的话,请特别注意/处理它们,尤其是运行它们的东西。

对我而言,它更多的是保留内存,或者大多数人会认为它只是另一个内存泄漏。

如果问题的来源来自第三方组件,那么我猜你必须追捕他们。

祝你好运,追求漏洞的罪魁祸首!

+0

你是对的,Memory Leak在这里有点用词不当。 – Gregory 2009-11-12 00:53:08