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

本文关键字:语言 何产生 泄漏 内存 了解 | 更新日期: 2023-09-27 18:10:47

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

有哪些方法可以引入内存泄漏?

是否有一些不明显的方式应该注意?

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

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

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

垃圾回收器很擅长它的工作,但是如果你不理解它在做什么,你在程序中引入内存问题的可能性非常高。

我建议阅读GC并了解它是如何工作的。

这里有一些东西可以让你开始:

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

二。

  • 首先,构建引用对象。比如在表单上创建订阅事件的对象。表单是活动的,所以不能被收集,而事件订阅…
  • 第二,在本机代码中阻塞垃圾收集器。比如oracle ODP。NET驱动程序在某些条件下运行。停止终结器,因此任何需要终结的对象都不会得到它——因此永远不会被释放。

在GC-ed语言中可能导致的明显的"内存泄漏"可能仅仅是在需要之后保留对对象的引用——如果您自己进行缓存或保留其他全局状态,这种情况尤其可能发生。

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

(我把这篇文章标记为CW,因为这个问题是开放式的。)

内存泄漏意味着在内存中保留不再需要的对象。在c#中,考虑到GC收集未引用的对象,这相当于说保留对不需要的对象的引用。考虑不正确的作用域声明,无限递归或迭代…