6

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

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

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

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

谢谢。

4

4 回答 4

3

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

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

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

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

于 2009-07-10T14:43:13.040 回答
2

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

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

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

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

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

于 2009-07-10T14:36:20.727 回答
1

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

感谢所有发帖的人!

于 2009-07-15T15:58:40.647 回答
1

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

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

Moataz 计算机工程师

于 2010-04-27T13:06:10.747 回答