Net Framework 简析

Net Framework Net 框架)

类库? 开发平台? 组件集合?

Net Framework 中微软引入了众多使编写基于组件的分布式系统更简单、灵活、强大的新技术,并使使用者可以更快的、轻松的掌握。

   

 

Framework 通过将高级语言转化为通用语言,使跨语言成为可能,通用语言在运行时通过JIT编译器 编译成本地即可执行代码。

1.    高级语言

对于各种开发语言,如C#  VB  C++  等等。

2.    通用语言

IL( Intermediate Language )  .net框架自己可识别的语言。

3.    通用语言运行时

CLR

 

     Net Framework 将各种高级语言托管后,跟据公共语言规范产生中间语言,在需要使用的时候(如页面加载,方法调用)进行编译产生中间语言,以提供给运行时使用。运行时是框架的核心。

 

运行时

代码验证、运行时编译执行技术(JIT just-in-time)、垃圾回收、加强安全策略、提供配置调试服务。

 

一. JIT

Net的即时编译器(JIT)用来将微软中间语言,(MIL)编译成本地即可执行代码,以次来实现多语言,跨平台支持。实际上.NetJIT并没有看上去即时编译那么简单,它有三种编译方式:

1. 有且仅一次:传统意义上的JIT,它是代码执行时按方法 Method)调用的需要来编译。需要注意的是它仅编译一次,然后就将本地代码存入及其缓存中,也因此提高了性能。
      2.
自动释放:经济型JIT,它是对上述传统性的改进。在运行时将MIL编译成本地代码后,如果系统内存不足,它将回收缓存在机器中的本地代码。这主要用在内存资源较紧张的消费类电子产品中。实际上这也是根据对计算机和消费类电子产品各自的计算行为进行数学模拟的结论——计算机的代码重复率极高,而电子产品的较低。
      3.
安装时编译:这种方式放弃执行时编译,因此也就避开了执行时的时间代价。它把编译的工作提到在本地机安装时来进行。这样在本地机的应用程序就是纯本地二进制代码了。

 

二. 垃圾回收

简介

.NET Framework,内存中的资源分为"托管资源""非托管资源".托管资源必须接受.NET FrameworkCLR的管理,而非托管资源则不必接受.NET FrameworkCLR管理.
托管资源在.NET Framework中又分别存放在两种地方: "堆栈""托管堆";规则是,所有的值类型和引用类型的引用都存放在"堆栈",而所有引用所代表的对象实例都保存在堆中。

C#,释放托管资源是可以自动通过"垃圾回收器"完成的(注意,"垃圾回收"机制是.NET Framework的特性,而不是C#),但具体来说,仍有些需要注意的地方:

1.值类型(包括引用和对象实例)和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自动释放所占内存(因为它们都保存在"堆栈",学过数据结构可知这是一种先进后出的结构);
2.
只有引用类型的引用所指向的对象实例才保存在"",而堆因为是一个自由存储空间,所以它并没有像"堆栈"那样有生存期("堆栈"的元素弹出后就代 表生存期结束,也就代表释放了内存),并且非常要注意的是,"垃圾回收器"只对这块区域起作用
;
3."
垃圾回收器"也许并不像许多人想象的一样会立即执行(当堆中的资源需要释放时),而是在引用类型的引用被删除和它在""中的对象实例被删除中间有个间隔,为什么呢? 因为"垃圾回收器"的调用是比较消耗系统资源的,因此不可能经常被调用!(当然,用户代码可以用方法System.GC.Collect()来强制执行"垃圾回收器
")
4
.有析构函数的对象需要垃圾收集器两次处理才能删除:第一次调用析构函数时,没有删除对象,第二次调用才真正删除对象。

5
.由于垃圾收集器的工作方式,无法确定C#对象的析构函数何时执行。

6
.可实现IDisposable接口的Dispose()来显示释放由对象使用的所有未托管资源。

7.垃圾收集器在释放了它能释放的所有对象后,就会压缩其他对象,把他们都移动回heap的端部,再次形成一个连续的块。

 

垃圾回收中的代

请想一想如果垃圾收集器每次总是扫描所有托管堆中的对象,对性能会有什么影响。会不会很慢?是的。微软因此引入了代的概念。

为什么代的概念可以提高垃圾收集器的性能?因为微软是基于对大量编程实践的科学估计,做了一些假定而这些假定符合绝大多数的编程实践:

越新的对象,其生命周期越短。

越老的对象,其生命周越长。

新对象之间通常有强的关系并被同时访问。

压缩一部分堆比压缩整个堆快。

有了代的概念,垃圾回收活动就可以大部分局限于一个较小的区域来进行。这样就对垃圾回收的性能有所提高。

让我们来看垃圾收集器具体是怎么实现代的:

0代:新建对象和从未经过垃圾回收对象的集合

1代:在第0代收集活动中未回收的对象集合

2代:在第1和第2代中未回收的对象集合, 即垃圾收集器最高只支持到第2, 如果某个对象在第2代的回收活动中留下来,它仍呆在第2代的内存中

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值