转录以自学

87 阅读5分钟

自动内存管理

播报

编辑

自动内存管理是公共语言运行时在托管执行过程中所能提供的服务之一。公共语言运行时的垃圾回收器为应用程序管理内存的分配和释放。对开发者而言,这意味着开发托管应用程序时不必编写执行内存管理任务的代码。自动内存管理可解决常见问题,例如忘记释放对象并导致内存泄露,或尝试访问已释放对象的内存。 [1]**

分配内存

初始化进程时,CLR为进程保留一个连续的地址空间区域。这个保留的地址空间被称为托管堆。托管堆上部署了所有引用类型,应用程序创建第一个引用类型时,将为托管堆的基址中的类型分配内存。从内存堆中分配内存要比非托管内存分配速度快。由于CLR通过为指针添加值来为对象分配内存,所以这几乎和堆栈中分配内存一样快。另外,由于连续分配的新对象在托管堆中是连续存储,所以应用程序可以快速访问这些对象。 [1]**

释放内存

垃圾回收器的优化引擎根据所执行的分配决定执行回收的最佳时间。垃圾回收器在执行回收时会释放应用程序不再使用的对象的内存。它通过检查应用程序的根本来确定不再使用的对象。每个应用程序都有一组根,每个根或者引用托管堆中的对象,或者设置为空。 [1]**

级别和性能

运行时的垃圾回收算法基于以下几个普遍原理。首先,压缩托管堆的一部分内存要比压缩整个托管堆速度快。其次,较新的对象生存期较短,而较旧的对象生存期则较长。最后,较新的对象趋于相互管理,并且大致同时由应用程序访问。 [1]**

为优化垃圾回收机制的性能,将托管堆分为3代:第0代、第1代和第2代。运行时的垃圾回收器将新对象存储在第0级中。在应用程序生存期的早期创建的对象如果未被回收,则被升级并存储在第1级和第2级中。 [1]**

为非托管资源释放内存

对于应用程序创建的大多数对象,可以依赖垃圾回收器自动执行必要的内存管理任务。但是,非托管资源需要显式清除。最常用的非托管资源类型是包装操作系统资源的对象,例如,文件句柄窗口句柄或网络连接。

垃圾回收器可以跟踪封装非托管资源的托管对象的生存期,但是无法具体了解如何清理资源。创建封装非托管资源的对象时,可以在公共Dispose()方法中提供必要的代码以清理非托管资源。通过提供Dispose()方法,对象的用户在使用完对象后显式释放其内存。 [1]

公共语言规范

公共语言规范(Common Language Specification,CLS)。公共语言规范是一组结构和限制条件,它是公共类型系统的子集,它们一起定义了允许不同编程语言的标准集,由这些编程语言编写的应用程序可以互操作。 [1]**

编程语言的区别不仅仅在于类型,语法或者说语言规范也都有很大的区别。因此.NET通过定义公共语言规范(Common Language Specification),限制了由这些不同点引发的互操作性问题。CLS是一种最低的语言的标准,制定了一种以.NET平台为目标的语言所必须支持的最小特征,以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。凡是遵守这个标准的语言在.NET框架下都可以实现互相调用。例如,在C#中命名是区分大小写的,而VB.NET不区分大小写,这样CLS就规定,编译后的中间代码必须除了大小写之外有其他的不同之处。 [4]**

为了实现跨语言开发和跨平台的战略目标,.NET所有编写的应用都不是编译为本地代码,而是编译成微软中间代码MSIL(Microsoft Intermediate Language)。它将由JIT(Just In Time)编译器转换成机器代码。C#和VB.NET代码通过它们各自的编译器编译成MSIL,MSIL遵守通用的语法,CPU不需要了解它,再通过JIT编译器编译成相应的平台专用代码,这里所说的平台是指我们的操作系统。这种编译方式实现了代码托管,还能够提高程序的运行效率。

优点

播报

编辑

使用公共语言运行时有许多优点,部分优点如下:

(1)它使程序的性能得到了改进;

(2)能够轻松的使用其他语言开发的组件;

(3)支持语言功能,例如面向对象编程的继承、接口和重载;

(4)允许创建多线程的可放缩应用程序的显示自由线程处理支持;

(5)结构化异常处理支持;

(6)自定义特性支持;

(7)垃圾回收机制;

(8)使用委托取代函数指针,从而增强了类型安全和安全性