CLR初识

一、什么是CLR?

CLR即公共语言运行时(Common Language Runtime,简称CRL),就是微软为.net产品构建的运行环境,与java的JVM类似,通俗的讲就是.net虚拟机。CLR上实际运行的并不是我们通常所用的编程语言(例如C#、VB等),而是一种字节码形态的“中间语言”。这意味着只要能将代码编译成这种特定的“中间语言”(MSIL),任何语言的产品都能运行在CLR上。CLR通常被运行在Windows系统上,但是也有一些非Windows的版本。这意味着.Net也很容易实现“跨平台”。CLR是.net系列产品运行的基础。
CLR基本工作原理如下图所示:
在这里插入图片描述
CLR基本原理:

把这几个概念一说基本就知道了,其实就是为了跨语言、跨平台,和JAVA的JVM类似

1.MSIL,中间语言,就是独立于所在平台系统的.net的特殊代码。里面含有相关元数据信息,常用的反编译工具想ILspy等就是靠他吃饭的。

2.CLR,公共语言运行时,其实就是把VB、VC、C#等不同语言编译成同一的中间语言

3.JIT,即使运行时,其实就是个翻译器,把IL翻译成对应系统的二进制代码并运行之

当然还有一些什么加载dll*exe等文件时的行为控制及解析里面(对象等)关系,验证程序集版本等等就没必要说了,谈不上主要原理

CLR内存管理:

1.堆栈,这个和C语言说的基本相同,

一般变量值存在栈中,用变量(栈指针)指向,程序调用过程就是入栈出栈过程,调用完即出完栈就没了;

而自定义类型数据一般存储堆(也叫托管堆)中,用变量(对象地址)指向,调用完可能还在内存,等待GC定时回收;

2.GC垃圾回收

垃圾回收方式,一般常用有标志清楚(即CLR用的)和引用计数器(OC用的就是)两个方式。

其实就是先循环查找标志不被引用的垃圾,再循环清楚,这个比较耗些资源,故oc用不起(oc计数又麻烦就有了ARC,这个OC另说)。

但GC回收不一定是实时的,好像有几个实用时间最短、最久没用等的算法什么的策略

3.非托管资源

不在CLR自动控制范围内的资源需要我们写代码手动释放,常见的想文件、网络、数据库等操作资源都是。

释放方式一般有两种:A,实现虚方法,B实现dispose方法(也就是using)

猜你喜欢

转载自blog.csdn.net/wo4641771/article/details/106491612
CLR