【问题标题】:Need Help Eliminating Weak References In My App需要帮助消除我的应用程序中的弱引用
【发布时间】:2009-07-10 14:15:53
【问题描述】:

我正在尝试解决我的应用程序中的内存泄漏问题。我已经下载并运行了 RedGate 的 ANTS Memory Profiler 5.0,内存分析器告诉我泄漏与 WeakReferences 有关。

我遇到的问题是我从未听说过 WeakReference,也没有在我的应用程序中明确声明它们。从我所做的阅读来看,我相信当你有一个试图被破坏但不能因为太多其他对象继续引用它的对象/资源时,会创建弱引用。我假设一个文件不能被删除,因为它仍在使用中。

所以我的问题是如何确定这些弱引用的来源?我怀疑这可能是使用 ByRef?另一位同事建议使用哈希表。

希望对弱参考检测和消除有一些澄清,对我的怀疑有一些澄清。

谢谢。

【问题讨论】:

  • 我感觉到你的痛苦,先生。我们争先恐后地构建了一个大型应用程序并将其推出,只是被告知它很慢,在使用一天的大部分时间后崩溃,并且会烧毁内存。从那时起,我们就一直在为这些我们认为 .NET 不允许发生的泄漏而进行无休止的战斗。

标签: .net weak-references


【解决方案1】:

在与 .NET 资源泄漏(内存/句柄/线程/等)的斗争中,我们发现了一个高于一切的罪魁祸首:延迟事件处理程序。如果我有一个想要处理的对象,但我仍然有一个事件处理程序注册到该对象的事件,那么该对象不会真正消失——这些僵尸会繁殖并串在一起直到 boom!你被管理的应用程序有一个资源泄漏的所有意图和目的。

我们采用了霰弹枪方法,并为我们手动添加的事件以及通过 VB.NET 的“Handles”关键字添加的最常用和最重的事件类进行了搜索,并确保在期间为每个事件调用 RemoveHandler / -=处置。我们还尽可能明确地 Dispose。

ANTS 是追踪这些问题的好工具,但它不是一个简单的工具(但它是我为这些问题找到的最简单的工具)。花一些时间熟悉它,如果您使用的是第 5 版,请使用这些新过滤器。

不幸的是,没有灵丹妙药,这是我对 .NET 最大的不满之一,因为通常你不知道你有问题,直到它非常广泛传播并且难以控制。

【讨论】:

  • 感谢 Yoooder 的智慧。需要注意的一点是,我的应用程序实际上是使用 Windows 服务实现的,并且将不断运行,并且只要服务正在运行,使用 AddHandler 的对象将保持活动状态,因此我没有机会使用 RemoveHandler。我们尝试在我们所有的类上实现 IDisposable 接口,但结果出乎意料,不得不回滚这些更改。
【解决方案2】:

使用WeakReference 不会导致内存泄漏。它会导致对象被收集,但您仍然可以在最后一刻选择访问它。

我没有使用内存分析器,但是:

我在 .Net 应用程序中的所有内存泄漏都与事件/委托有关。

当你添加一个方法来监听一个事件时,你创建了一个从包含事件(关键字)的对象到具有你想要调用的方法的对象的引用。

如果对包含该方法的对象的所有其他引用都消失了,您可能会认为它会被收集,但仍然存在通过事件的(不可见的)引用。

【讨论】:

  • 嗨,GVS。我想指出的一个区别是我没有使用 Wea​​kReferences......至少没有明确地......当我在我的应用程序上使用内存分析器时,我看到的是我有很多它们弹出启动或间接创建,我不确定为什么。
  • .Net 框架本身在内部使用 Wea​​kReferences,对此您无能为力。我认为问题不在于弱引用本身,而是您使用某些组件的方式,即使用弱引用。我仍然怀疑委托/事件是您问题的根本原因。
【解决方案3】:

我发现我的 WeakReferences 是由 System.Diagnostics.TextWriterTraceListener 类创建的。我仍然没有解决我的内存泄漏问题,而且我深陷其中,我开始怀疑我是否有内存泄漏,但知道 WeakReferences 的来源让我松了一口气。

感谢所有发帖的人!

【讨论】:

    【解决方案4】:

    此内存泄漏是 .NET 框架中的一个已知错误。 __ENCList 是一个内部 .NET 类,用于提供编辑和继续功能。解决此问题的唯一方法是在发布模式下重新编译。 (如果您一直使用调试模式在生产环境中提供详细的异常报告,这很不幸。)

    http://support.microsoft.com/?kbid=919481

    莫阿塔兹 计算机工程师

    【讨论】:

    • 很有趣...我不确定我们编译的状态是什么,但我现在会检查一下。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多