这个过程要比一开始就编译整个应用程序代码的效率高一些,因为任何应用程序的大部分代码实际上并不是在每次运行时都执行的。这也解释了为何托管IL代码的执行速度几乎与内部机器代码的执行速度一样快。
(3)语言的互操作性。使用IL不仅支持平台无关性,还支持语言的互操作性,即能将任何一种语言编译为中间代码,编译好的代码可以与其他语言的代码交互操作。
5.自动内存管理
自动内存管理是CLR在托管执行过程中提供的服务之一。在使用传统的编程语言(例如C、C++等)开发程序时,***往往需要自行编写代码来实现管理内存、为数据分配内存空间、释放无��的内存空间等功能。
CLR的自动内存管理机制可以让NET Framework来自动管理内存的分配和释放,对于***而言,这就意味着开发托管应用程序时省略了管理内存的步骤,避免了忘记释放对象导致的内存泄漏。
1)分配内存
在初始化新进程时,CLR会为进程保留一个连续的地址空间区域,这个保留的地址空间称为托管堆(Managed Heap)。托管堆维护着一个指针,指向将在堆中分配的下一个对象地址。*初,该指针设置为指向托管堆的基址。托管堆上部署了所有引用类型,应用程序在创建**个引用类型时将为托管堆基址中的类型分配内存。应用程序创建下一个对象时,CLR在紧接**个对象后面的地址空间内为其分配内存。只要地址空间可用,CLR就会继续以这种方式为新对象分配空间。
从托管堆中分配内存要比从非托管内存中分配速度更快。由于CLR通过为指针添加值来为对象分配内存,因此这几乎和从堆栈中分配内存一样快。另外,由于连续分配的新对象在托管堆中是连续存储的,因此应用程序可以快速访问这些对象。
2)释放内存
在托管模式下,每个应用程序都有一组根元素,这些根元素包含全局对象指针、静态对象指针、线程堆栈中的局部变量、引用对象参数和CPU寄存器等。每个根或者引用托管堆中的对象,或者设置为空。
垃圾回收器(Garbage Collector,GC)可以访问由JIT编译器和运行时维护的活动根的列表,对照此列表检查应用程序的根,并在此过程中创建一个图表,包含所有可从这些根中访问的对象。另外,GC的优化引擎会根据所执行的分配决定执行回收的*佳时间,还会在执行回收时通过检查应用程序的根来确定程序不再使用的对象,并释放该对象占据的内存。.在回收的过程中,GC检查托管堆,查找无法访问的对象所占据的地址空间块,发现无法访问的对象时,就使用内存复制功能来压缩内存中可访问对象,释放分配给不可访问对象的地址空间块。在压缩了可访问对象的内存后,GC就会作出必要的指针更正,以便应用程序的根指向新地址中的对象。为了改进性能,GC会自动释放不再使用的内存。
……