帮助查找内存泄漏原因

时间:2010-02-09 13:27:57

标签: .net vb.net winforms .net-2.0 memory-leaks

我在 VB.NET(。NET2)应用程序中有以下泄漏情况:表单 - DetailTache(TaskDetails) - 在我的MDI应用程序中没有收集垃圾是不收集的打开/关闭。

我做了以下分析根:

alt text http://lh6.ggpht.com/_1TPOP7DzY1E/S3Fg3ifizgI/AAAAAAAADC0/flRMOatEljs/s800/Capture2.png

知道如何解决这个漏洞吗?感谢。

编辑:

WinComboRowSelected 事件的projet搜索结果。应用程序中有3个用法:

  1. WinCombo类声明:Event WinComboRowSelected(ByVal sender...(仅限一个)
  2. 提升:RaiseEvent WinComboRowSelected(sender,(3次提升)
  3. 用法:...e As Keolis.ctlWinCombo.WinCombo.WinComboRowSelectedEventArgs) Handles cmbProduit1.WinComboRowSelected(多个句柄)。
  4. 此事件没有其他用法。

    如果需要其他代码详情,请询问,我会发布。

5 个答案:

答案 0 :(得分:5)

对象树中显示的工具提示对我来说很重要。它可能为RowSelected事件连接事件处理程序,因此它可以更新提示。很明显,你使用的是第三方控件,它闻起来像Infragistics。不是一家以其产品质量而闻名的公司。我进一步猜测ToolTip是其控件的内部,你无法访问它以强制取消订阅事件处理程序。除了放弃工具提示之外,如果可能的话,你做不了多少,但联系供应商寻求支持。或者放弃控制。

答案 1 :(得分:0)

如果没有您的代码,很难说如何修复泄漏。

记住什么会使物品不被垃圾收集。如果它仍然有对象的引用。

我会查看你的可能并确保所有引用都设置为null,当你期望它被收集时。如果没有被收集那意味着某些东西仍然有参考它。

为了更好地理解垃圾收集,我会阅读此article

答案 2 :(得分:0)

您的表单是否有任何尚未取消订阅的事件处理程序?这将是控制不被垃圾收集的首要原因。

在处理表单之前,请确保订阅WinComboRowSelectedEvent的表单也取消订阅。

答案 3 :(得分:0)

VMMap为实时进程的内存分析提供了灵活的视图:

  

VMMap是一个进程虚拟和物理内存分析实用程序。它显示了进程提交的虚拟内存类型的细分以及操作系统为这些类型分配的物理内存(工作集)的数量。除了内存使用的图形表示外,VMMap还显示摘要信息和详细的进程内存映射。强大的过滤和刷新功能使您可以识别进程内存使用的来源和应用程序功能的内存成本。

答案 4 :(得分:0)

正如指出 nobugs (再次感谢),问题确实存在于使用过的第三方组件 - Infragistics中。

正如我后来发现的那样,Infragistics团队决定对内存中所有添加的控件保持静态引用,以便支持XP主题更改时的这种(二次imho)效果。

这个问题真正有用的是 this article ,女巫提供的解决方案用WeakReferences替换了保存在内存对象中,可以由GC收集。

幸运的是,我们在文章和解决方案中使用了旧版本的Infragistics。然而,令人遗憾的是,Infragistics不打算修复这个错误,甚至在几年前宣布过。