想要了解像C#这样的托管语言是如何发生内存泄漏的

时间:2011-10-06 14:23:08

标签: c# memory-management memory-leaks

由于C#是一种自动执行垃圾收集以清理对象等的托管语言,...

可以引入内存泄漏的方法是什么?

是否有一些人应该注意的非显而易见的方法?

如何检测或查找内存泄漏(一旦了解了它们的生成方式等)。

4 个答案:

答案 0 :(得分:4)

通常泄漏以开发人员编写代码的形式出现,这些代码在不应该存在时“保留”对象,随后不允许垃圾收集器收集这些对象。

垃圾收集器非常擅长它的功能,但是如果你不明白它在做什么,那么你在程序中引入内存问题的可能性非常高。

我建议您阅读GC并了解其工作原理。

这是让你入门的东西:

http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

答案 1 :(得分:0)

两个

  • 首先,构建引用的对象。就像创建订阅表单上的事件的对象一样。表单处于活动状态,因此无法收集,事件订阅...使对象保持活动状态。
  • 其次,在本机代码中阻止垃圾卷取器。就像oracle ODP.NET driever在某些条件下所做的那样。停止终结器,因此任何需要最终确定的对象都不会获得它 - 因此永远不会被释放。

答案 2 :(得分:0)

在GC-ed语言中可能导致的明显的“内存泄漏”只会在需要之后保留对对象的引用 - 如果你滚动自己的缓存或保持其他全局状态,这尤其可能。 / p>

另一种方法是在未处理的非托管资源中泄漏内存,尽管大多数标准库类可能会处理析构函数中的内存,因此迟早会回收内存。

(由于问题的开放性,我将帖子标记为CW。)

答案 3 :(得分:0)

内存泄漏意味着保留在您不再需要的内存对象中。在C#中,考虑到GC收集未引用的对象,它相当于保持对不需要的对象的引用。 想想不正确的范围声明,无限递归或迭代......