.net - 需要帮助消除我的应用程序中的弱引用

标签 .net weak-references

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

我遇到的问题是我从未听说过 WeakReference 也没有在我的应用程序中明确声明它们。根据我所做的阅读,我相信弱引用是在您有一个试图被销毁但无法销毁的对象/资源时创建的,因为有太多其他对象一直在引用它。我假设一个文件不能被删除,因为它仍在使用中。

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

希望得到一些关于弱引用检测和消除的澄清,并澄清我的怀疑。

谢谢。

最佳答案

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

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

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

不幸的是,没有 Elixir ,这是我对 .NET 最大的不满之一,因为通常您不知道自己遇到了问题,直到问题非常广泛且难以控制。

关于.net - 需要帮助消除我的应用程序中的弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1109794/

相关文章:

java - 当实际对象被垃圾回收时,WeakHashMap 中条目中的值如何被垃圾回收?

java - JVM - 弱引用是否在次要 GC 中收集?

objective-c - 如果在 Objective-c 中作为参数传递,引用是否仍然很弱?

c# - 为什么 Process.Start 会意外返回 false

c# - 模型的中心Visual3D

c# - 如何从 DataTable 对象创建校验和?

swift - 有没有办法检查 `unowned` (实际上是 `unowned(safe)` )引用已被取消?

.net - Rx 中的 IConnectableObservables

c# - 如何计算看起来非常接近 Winforms 控件的控件的禁用文本颜色?

python - 使用 Django session 中间件进行垃圾收集