我正在追踪MDI应用程序内的内存泄漏。打开,然后关闭窗体,将窗体留在内存中。使用Ant的内存分析器,我可以得到下面的图形保存内存中的形式。内存泄漏/形式不被垃圾收集
当Dispose触发窗体时,我已经删除了任何和所有附加到组合控件的事件。
任何人都可以指导我解决问题吗?
C1命名空间来自ComponentOne。
我应该注意到,我试图看看C1Combo控件上的c,r,b等方法是通过反射器实现的,但它显然是通过一个让事情变得难以理解的obfusticator运行的。
我正在追踪MDI应用程序内的内存泄漏。打开,然后关闭窗体,将窗体留在内存中。使用Ant的内存分析器,我可以得到下面的图形保存内存中的形式。内存泄漏/形式不被垃圾收集
当Dispose触发窗体时,我已经删除了任何和所有附加到组合控件的事件。
任何人都可以指导我解决问题吗?
C1命名空间来自ComponentOne。
我应该注意到,我试图看看C1Combo控件上的c,r,b等方法是通过反射器实现的,但它显然是通过一个让事情变得难以理解的obfusticator运行的。
将其跟踪到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();
}
C1可能具有通过不释放内部基准中的错误。 Contact the company or search their knowledgebase。
对于不同的第三方组件,我记得Telerik控制有我们报告过的错误,并且这些东西在下一个版本中修复 - 有时他们提供了一个即时的解决方法。
这让我想起我在1.1年前基于.NET构建的一个巨大的C#WinForm应用程序。我用.NET Memory Profiler,男孩帮我找到寄生虫。蚂蚁的MP可能可以这样做。
无论如何,在我的情况下,我在使用过程中创建了很多并行线程和定时器。罪魁祸首原来是一个计时器实例,它从未妥善处理过,因此永远不会结束定时器运行的衍生线程。
不是我可以直接给你提供答案,但是如果你碰巧有线程产卵的话,请特别注意/处理它们,尤其是运行它们的东西。
对我而言,它更多的是保留内存,或者大多数人会认为它只是另一个内存泄漏。
如果问题的来源来自第三方组件,那么我猜你必须追捕他们。
祝你好运,追求漏洞的罪魁祸首!
你是对的,Memory Leak在这里有点用词不当。 – Gregory 2009-11-12 00:53:08