内存泄漏/表单没有被垃圾收集

时间:2009-11-12 00:20:26

标签: c# memory memory-leaks componentone

我正在跟踪MDI应用程序中的内存泄漏。打开,然后关闭表单会导致表单停留在内存中。使用Ant的内存分析器,我可以获得以下图表,将表单保存在内存中。

当Dispose在表单上触发时,我已删除了我们附加到组合控件的所有事件。

有人可以指导我找到解决方案吗?

C1命名空间来自ComponentOne。

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

Ant's Reference Graph

3 个答案:

答案 0 :(得分:2)

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

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

并非我可以直接为您提供答案,但如果您碰巧有线程产生,请注意观察/处理它们,尤其是在其中运行的东西。

对于我的情况,它更多的是内存保留,或者大多数人认为这只是另一个内存泄漏。

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

祝你找到泄密的罪魁祸首!

答案 1 :(得分:1)

C1可能因未发布内部引用而出现错误。 Contact the company or search their knowledgebase

使用一组不同的第三方组件,我记得Telerik控件有我们报告的错误,并且这些内容在下一个版本中得到修复 - 有时它们提供了即时解决方法。

答案 2 :(得分:0)

将其追溯到C1Combo中对控件的内部引用。有一个列表由于某种原因引用了表单和其他一些东西。在窗体上的Dispose()中,我对每个C1Combo控件调用此函数。不知道后果,可能是最小的,因为控制应该被处置。

它也非常脆弱,好像它们发布了一个新版本,并且obfustication弄乱了所有方法/字段名称,它会破坏。

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();
    }