我正在尝试在我的应用中解决内存泄漏问题。我已经下载并运行了RedGate的ANTS Memory Profiler 5.0,内存分析器告诉我泄漏与WeakReferences有关。
我遇到的问题是我从未听说过WeakReference,也没有在我的应用中明确声明它们。从我已经完成的阅读中我相信,当你有一个试图被销毁的对象/资源但是因为太多其他对象不断引用它时,会创建弱引用。我假设文件无法删除,因为它仍在使用中。
所以我的问题是如何确定这些弱引用的来源?我怀疑它可能是ByRef的用途?另一位同事提出了哈希表。
希望对弱引用检测和消除做一些澄清,并对我的怀疑做一些澄清。
感谢。
答案 0 :(得分:3)
在与.NET资源泄漏(内存/句柄/线程/等)的斗争中,我们发现了一个最重要的罪魁祸首:挥之不去的事件处理程序。如果我有一个我想要处理的对象,但是我仍然有一个事件处理程序注册到该对象的事件,那么该对象将不会真正消失 - 这些僵尸在链中相乘并串起来直到热潮!你管理的应用程序具有资源泄漏的所有意图和目的。
我们采用了猎枪方法并搜索了我们使用最频繁,最重的类,我们手动添加的事件和VB.NET的“Handles”关键字,并确保在每个期间调用RemoveHandler / - =处置。我们也尽可能明确地处理。
ANTS是一个很好的跟踪这些功能的工具,但它不是一个简单的工具(但它是我发现的最简单的工具)。花一些时间熟悉它,如果你使用的是版本5,那么就可以使用这些新的过滤器。
不幸的是,没有灵丹妙药,这是我对.NET最大的攻击之一,因为通常你不知道你有问题,直到它非常广泛且难以统治。
答案 1 :(得分:2)
使用WeakReference不应导致内存泄漏。它会导致收集一个对象,但你仍然有最后一刻的选择来访问它。
我没有使用Memory Profiler,但是:
.Net应用程序中的所有内存泄漏都与事件/代理有关。
当您添加一个方法来侦听事件时,您将从包含事件(关键字)的对象创建一个引用到具有您要调用的方法的对象。
如果对包含该方法的对象的所有其他引用都消失了,您可能会认为它将被收集,但事件仍然存在(不可见)引用。
答案 2 :(得分:1)
我发现我的WeakReferences是由System.Diagnostics.TextWriterTraceListener类创建的。我仍然没有解决我的内存泄漏问题,而且我已经深入了解我是否开始质疑我是否有内存泄漏但是我很放心地知道WeakReferences的来源。
感谢所有发帖的人!
答案 3 :(得分:1)
此内存泄漏是.NET框架中的已知错误。 __ENCList是一个内部.NET类,用于提供编辑和继续功能。解决此问题的唯一方法是在发布模式下重新编译。 (如果您一直使用调试模式在生产环境中提供详细的异常报告,那将是不幸的。)
Moataz 计算机工程师