赞
踩
转载地址:https://zhuanlan.zhihu.com/p/269299903
英文地址:https://michaelscodingspot.com/ways-to-cause-memory-leaks-in-dotnet/
文章内容太多,大家直接看转载地址吧
任何有经验的.NET开发人员都知道,即使.NET应用程序具有垃圾回收器,内存泄漏始终会发生。并不是说垃圾回收器有bug,而是我们有多种方法可以(轻松地)导致托管语言的内存泄漏。
内存泄漏是一个偷偷摸摸的坏家伙。很长时间以来,它们很容易被忽视,而它们也会慢慢破坏应用程序。随着内存泄漏,你的内存消耗会增加,从而导致GC压力和性能问题。最终,程序将在发生内存不足异常时崩溃。
在本文中,我们将介绍.NET程序中内存泄漏的最常见原因。所有示例均使用C#,但它们与其他语言也相关。
定义.NET中的内存泄漏
在垃圾回收的环境中,“内存泄漏”这个术语有点违反直觉。当有一个垃圾回收器(GC)负责收集所有东西时,我的内存怎么会泄漏呢?
这里有两个核心原因。第一个核心原因是你的对象仍被引用但实际上却未被使用。由于它们被引用,因此GC将不会收集它们,这样它们将永久保存并占用内存。例如,当你注册了事件但从不注销时,就有可能会发生这种情况。我们称其为托管内存泄漏。
第二个原因是当你以某种方式分配非托管内存(没有垃圾回收)并且不释放它们。这并不难做到。.NET本身有很多会分配非托管内存的类。几乎所有涉及流、图形、文件系统或网络调用的操作都会在背后分配这些非托管内存。
通常这些类会实现 Dispose 方法,以释放内存。你自己也可以使用特殊的.NET类(如Marshal)或PInvoke轻松地分配非托管内存。
许多人都认为托管内存泄漏根本不是内存泄漏,因为它们仍然被引用,并且理论上可以被回收。这是一个定义问题,我的观点是它们确实是内存泄漏。它们拥有无法分配给另一个实例的内存,最终将导致内存不足的异常。
对于本文,我会将托管内存泄漏和非托管内存泄漏都归为内存泄漏。
以下是最常见的8种内存泄露的情况。
前6个是托管内存泄漏,后2个是非托管内存泄漏。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。