.NET资源漏洞陷入困境

时间:2009-05-29 16:00:39

标签: .net memory memory-leaks resource-leak

开发人员有几种方法可能会被.NET中无意的资源泄漏所困扰。我认为将它们集中在一个地方会很有用。

请为每个项目添加一个答案,以便最好的投票:)

17 个答案:

答案 0 :(得分:8)

无法删除事件处理程序。

注册活动应与取消注册配对:

   this.myObject.MyEvent += new EventHandler(myObject_MyEvent);
   this.myObject.MyEvent -= new EventHandler(myObject_MyEvent);

有一个系统的示例,其中CodeProject发生了这种情况。

答案 1 :(得分:7)

P /调用非托管代码,而不是清理它们,或者不实现IDisposable来清除它们。

答案 2 :(得分:7)

未使用Using

答案 3 :(得分:6)

让数据库连接保持打开状态。

答案 4 :(得分:4)

无法实现Dispose,因此无法处置子对象。

答案 5 :(得分:4)

WCF客户端对象的执行方式与其他IDisposable对象不同。如果操作处于故障状态,则必须中止WCF服务的客户端,否则它将保持连接打开。这通常是艰难的学习方法。

答案 6 :(得分:2)

使用Office API时几乎所有内容。由于它们都是COM对象,因此必须进行处理。如果要使用事件处理程序,还必须保留对它们的类​​引用,否则它们将丢失其引用。在很多情况下,您甚至必须手动调用GC才能清理对象

答案 7 :(得分:2)

简单内存泄漏:在List类中创建一个静态字段。将项目添加到列表。他们永远不会收集垃圾,所以除非你记得在你完成它们时手动删除你的物品,否则记忆会被永久地束缚。

答案 8 :(得分:2)

使用WeakReference会导致WeakReference保留的对象被清理的细微泄漏,因为它没有强引用,但WeakReference本身并不是因为你保留了对它的强引用。

如果你有一些你永远不会修剪的List或WeakReferences字典,你可以遇到这种情况。即使收集了目标,您最终也会泄漏WeakReference对象。

答案 9 :(得分:1)

在启动代码之外填充的静态列表,字典和基于集合的资源。

如果您将Dictionary用作全局缓存而不是基于LRU的正确缓存,则会发生这种情况。

任何静态需要非常谨慎!

答案 10 :(得分:1)

如果将托管内存计为“资源” - 未能解除事件处理程序是内存泄漏的常见原因(以及其他各种更严重的错误)。

答案 11 :(得分:1)

无法在System.Windows.Window对象上调用'Close'方法。

确保System.Windows.Window对象的所有托管资源都是垃圾回收的唯一方法是在Window对象上调用'Close()'方法。调用Dispose或将对象引用设置为null不会破坏对象。

答案 12 :(得分:0)

未能在.NET Compact Framework上处理任何与绘图相关的对象(图形,字体,SolidBrush,Pen等)。当您不需要时,这可能会导致严重的内存泄漏(移动设备=内存有限)。

答案 13 :(得分:0)

模拟令牌句柄处于打开状态。

答案 14 :(得分:0)

答案 15 :(得分:0)

错误配置Spring.NET以创建应该是单例的多个实例。

答案 16 :(得分:0)

无法在Timer

上调用Dispose()
相关问题