代码之家  ›  专栏  ›  技术社区  ›  Gregory

内存泄漏/未对窗体进行垃圾收集

  •  0
  • Gregory  · 技术社区  · 16 年前

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

    有人能告诉我一个解决办法吗?

    C1名称空间来自ComponentOne。

    我应该注意到,我试图通过reflector查看C1Combo控件上的c、r、b等方法是什么,但它显然是通过一个模糊处理程序运行的,这使得事情很难理解。

    Ant's Reference Graph

    3 回复  |  直到 16 年前
        1
  •  2
  •   o.k.w    16 年前

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

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

    并不是说我可以直接给你一个答案,但是如果你碰巧有线程到处繁殖,一定要仔细观察/处理它们,尤其是其中运行的东西。

    对于我来说,这更多的是内存保留,或者尽管大多数人会认为这只是另一个内存泄漏。

    祝你好运追踪泄密者!

        2
  •  1
  •   John K    16 年前

    Contact the company or search their knowledgebase .

    我记得Telerik控件有一组不同的第三方组件,我们报告了它们的bug,这些bug在下一个版本中得到了修复——有时它们提供了一个即时解决方案。

        3
  •  0
  •   Gregory    16 年前

    它也是非常脆弱的,好像他们发布了一个新版本,而混淆会弄乱所有的方法/字段名,它会崩溃。

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