关于CLR运行时的一些琐碎知识点

1、元数据是一系列特殊的数据表,它描述了模块中定义的内容,比如类型或其他成员,用简单的话说就是描述数据的数据。

2、元数据的主要作用有以下几点:首先,可以帮助我们编写代码,例如VS.net IDE中的智能感知就是使用了元数据。其次,元数据可以消除对头和库文件的需要。再次,它可以将对象序列化成一个内存块,然后发送该内存块进行通信,通信接收方又可以通过反序列化将其还原为对象。最后,它允许垃圾收集器收集对象的周期。 

 

 3、 IL是基于堆栈的,而且IL没有操作寄存器的指令,这为编程人员提供方便。IL在编译成本地代码时,会对代码进行安全性验证,检查类型、参数是否正确以及内存分配是否正确等。

 

4、程序集是由托管模块以及资源文件组成的。在一个托管模块里面,一般包括PE头(PE头包括PE32以及PE32+,PE32+主要是运行在64位机器上的)、CLR头(包括CLR版本、托管模块入口方法等)、元数据、IL。 

 

5、托管代码相对于非托管代码有以下优势:首先,JIT会判断CPU的类型,然后根据CPU的类型生成该CPU的特殊指令,从而提高了运行速度;非托管代码编译成机器代码时,并不知道CPU的类型,所以不能使用一些特殊的指令。其次,编译器会评估代码的运行情况,减少一些不正确的分支。

6、使用Ngen.exe生成的代码不会象JIT编译器所生成机器代码那样高度优化,虽然提高了启动速度,但运行效率不一定高。 

 7、CLR的内存管理分3部分,包括线程的堆栈、GC堆、LOH堆。

线程的堆栈:用于分配值类型的实例,由操作系统进行管理,执行效率比较高。

GC堆:用于分配小对象实例,但内存分配或垃圾回收时,垃圾收集器可能会对GC堆进行压缩。

LOH堆:用于分配大对象,不会被压缩。

你可能感兴趣的:(LR)