【问题标题】:Help finding a Memory Leak cause帮助查找内存泄漏原因
【发布时间】:2011-01-14 19:39:20
【问题描述】:

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

我做了以下分析根:

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

知道如何修复此泄漏吗?谢谢。

编辑:

WinComboRowSelected事件的项目搜索结果。这个词在应用中有3种用法:

  1. WinCombo 类中的声明:Event WinComboRowSelected(ByVal sender...(只有一个)
  2. 加注:RaiseEvent WinComboRowSelected(sender,(3 次加注)
  3. 用法:...e As Keolis.ctlWinCombo.WinCombo.WinComboRowSelectedEventArgs) Handles cmbProduit1.WinComboRowSelected(多个句柄)。

此事件没有其他用途。

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

【问题讨论】:

  • @dada686:好的,告诉我你想看什么?

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


【解决方案1】:

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

我后来发现,Infragistics 团队决定在内存中保留对所有添加控件的静态引用,以支持 XP 主题更改时的此类(次要恕我直言)效果。

this article 对这个问题非常有帮助,witch 提供的解决方案用 Wea​​kReferences 替换了保留在内存中的对象,这些对象可以被 GC 收集。

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

【讨论】:

    【解决方案2】:

    对象树中出现的工具提示对我来说很重要。它可能会为 RowSelected 事件连接一个事件处理程序,以便它可以更新提示。显然,您使用的是 3rd 方控件,它闻起来像 Infragistics。不是一家以其产品质量而闻名的公司。我进一步猜测 ToolTip 在其控件内部,并且您无法访问它以强制取消订阅事件处理程序。除了放弃工具提示之外,如果可能的话,您也无能为力,只能联系供应商寻求支持。或者放弃控制。

    【讨论】:

    • :) 像往常一样,你在正确的中心拍摄(对不起,这么非英语的翻译)。你有理由,工具提示似乎很重要,因为我看到其他非处置资源通过这个奇怪的工具提示从 MDIMainForm 传递同样的想法。我们使用一些第 3 方控件,其中之一是 Infragistics。不仅如此:Public Class WinCombo Inherits Infragistics.Win.UltraWinGrid.UltraCombo
    • Hmya,我不明白你为什么不透露这种重要信息。分散在 4 个线程上,都是关于同一个问题,你已经浪费了这个论坛大约 15 位贡献者的时间。在这里提问对你来说似乎是一种游戏。英文术语是“rep whoring”,我不知道法语术语。无论如何,放弃控制,Infragistics 会制造垃圾。
    • @nobugz:首先,感谢您启发问题。现在,你没有理由批评。我怎么知道这个信息是必不可少的?!这对我来说是一个真正的“发现”,第三个控制可能导致这种泄漏!其次,我关于内存泄漏的其他线程与这个问题没有直接联系。通过例如“如何在基本表单上删除处理程序”是一个普遍的问题,“委托是否会导致内存泄漏”是另一个(已经解决的)问题 - 我有一个未处理的委托,但我已经没有了,EventHandler 和内存泄漏也是一个一般问题等。
    • “rep whoring”或游戏怎么样,我不会评论它,只是如果你不想花时间回答问题,就不要这样做,如果你想抱怨的话我偷了你的时间,你太可笑了。你真的认为我没有其他事情可做,发布“垃圾邮件”并接收/给予积分吗?!最后,也许我在一个法国项目上工作,但这并不意味着我是一个法国人。
    • 附言。您肯定否决了该问题,因为您知道论坛规则并且该问题“不清楚或无用”,但是您一眼就回答了它,这确实对我有所帮助。
    【解决方案3】:

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

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

    【讨论】:

    • 这是一个分析内存使用的工具——你有内存泄漏。加入点。
    • 在我的例子中,我使用了 JetBrains dotTrace 和 .NET Memory Profiler,VMMap 可以告诉我更多我已经拥有的信息吗?
    • 对不起,serhio。我只知道你的问题和 gimel 的答案之间的联系。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      我会查看您的权限,并确保在您希望收集所有引用时将其设置为 null。如果它没有被收集,则意味着某些东西仍然有对它的引用。

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

      【讨论】:

      • EventHandler 的引用,正如我们在我的例子中看到的那样,检测起来并不那么明显......我在编辑中添加了一些解释。
      猜你喜欢
      • 2011-02-18
      • 2020-10-11
      • 2011-06-10
      • 1970-01-01
      • 2012-09-15
      • 2013-12-21
      • 2017-07-31
      相关资源
      最近更新 更多