.net自动内存管理(垃圾回收)

一,理解垃圾回收平台的基本工作原理
每个程序都要使用这样或那样的资源,比如文件、内存缓冲区、屏幕空间、网络连接、数据库资源等。事实上,在面向对象的环境中,每个类型都代表可供程序使用的一种资源。要使用这些资源,必须为代表资源的类型分配内存。以下是访问一个资源所需的具体步骤
1,调用IL指令newobj, 为代表资源的类型分配内存。在C#中使用new操作符,编译器就会自动生成该指令。
2,初始化内存,设置资源的初始状态,使资源可用。类型的实例构造器负责设置该初始状态。
3,访问类型的成员来使用资源。
4,摧毁资源的状态以进行清理。
5,释放内存。垃圾回收器独自负责这一步。

这其中有两种bug最为严重,1,程序员忘记释放不再需要的内存。2,程序员试图使用已被释放的内存。

这两种bug会造成资源泄露(浪费内存)和对象损坏(影响稳定性),这使应用程序的表现变得不可预测,幸好有一种机制能为开发人员简化这种令人厌恶的内存管理任务。那就是垃圾回收(garbage -
collection).简称GC.

但是垃圾回收期对内存中的类型所代表的资源是一无所知的。这意味着垃圾回收器不知道怎样执行前面的第4步;摧毁资源的状态以进行清理。为了使资源得到正确清理,开发人员必须编写知道如何正确清理资源的代码。这些代码要放在Finalize,Dispose和close方法中,然后正如后文所讲到的,垃圾回收期在这里也能提供一些帮助,使开发人员大多数时候都可以跳过第四步。

需要注意的是值类型(含所有枚举类型)、集合类型、String、Attribute、Delegate和exception 所代表的资源无需执行特殊的清理操作。例如,只需销毁对象的内存中维护的字符串组,一个String资源就会被完全清理。

另一方面,如果一个类型代表着一个非托管资源或者本地资源(比如文件、数据库连接、套接字、mutex、位图、图标等),那么在对象的内存准备回收时,必须执行一些资源清理代码。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页