net 解密--深入理解.net垃圾收集机制

net 解密--深入理解.net垃圾收集机制

ID:37419815

大小:188.93 KB

页数:24页

时间:2019-05-23

net 解密--深入理解.net垃圾收集机制_第1页
net 解密--深入理解.net垃圾收集机制_第2页
net 解密--深入理解.net垃圾收集机制_第3页
net 解密--深入理解.net垃圾收集机制_第4页
net 解密--深入理解.net垃圾收集机制_第5页
资源描述:

《net 解密--深入理解.net垃圾收集机制》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、.NET解密--深入理解.NET垃圾收集机制作者:缘清(aicken)  来源:博客园  发布时间:2010-01-1410:38  阅读:435次  原文链接  全屏阅读 [收藏]    前言:  组成.Net平台一个很重要的部分----垃圾收集器(GarbageCollection),今天我们就来讲讲它。想想看没有GC,.Net还能称之为一个平台吗?各种语言虽然都被编译成MSIL,但是运行时的资源回收工作却“各自为战”,这样不但增加了编程难度,也会使内存管理工作变得复杂无比(不同语言处理内存的微小差异,将在回收资源时被放大),更也不利于

2、平台移植。  这篇文章将全面的为大家介绍.Net垃圾收集的运行方式、算法,以及与垃圾收集相关的关键方法。  说到垃圾收集机制,很少有人知道,垃圾收集并不是伴随Java出现的,早在1958年,图林奖得主John发明的Lisp语言就已经提供了GC的功能,这是GC的第一次出现,是思想的一次闪光!而后,1984年DaveUngar发明的Smalltalk语言第一次正式采用了GC机制。  .Net的垃圾回收机制是个很大的话题,如果你没接触过类似C++那样的语言,就很难理解GC是一个多么重要、令人兴奋的东西:  1.提高软件系统的内聚。  2.降低编程

3、复杂度,使程序员不必分散精力去处理析构。  3.不妨碍设计师进行系统抽象。  4.减少由于内存运用不当产生的Bug。  正文:  本文将通过“GC的算法与工作方式”、“GC关键方法解析”两节来讲述.Net垃圾收集机制。  第一节.GC的算法与工作方式  1.算法  垃圾收集器的本质,就是跟踪所有被引用到的对象,整理对象不再被引用的对象,回收相应的内存。  这听起来类似于一种叫做“引用计数(ReferenceCounting)”的算法,然而这种算法需要遍历所有对象,并维护它们的引用情况,所以效率较低些,并且在出现“环引用”时很容易造成内存泄露

4、。所以.Net中采用了一种叫做“标记与清除(MarkSweep)”算法来完成上述任务。  “标记与清除”算法,顾名思义,这种算法有两个本领:  “标记”本领——垃圾的识别:从应用程序的root出发,利用相互引用关系,遍历其在Heap上动态分配的所有对象,没有被引用的对象不被标记,即成为垃圾;存活的对象被标记,即维护成了一张“根-对象可达图”。  其实,CLR会把对象关系看做“树图”,无疑,了解数据结构的同学都知道,有了“树图”的概念,会加快遍历对象的速度。  检测、标记对象引用,是一件很有意思的事情,有很多方法可以做到,但是只有一种是效率最

5、优的,.Net中是利用栈来完成的,在不断的入栈与出栈中完成检测:先在树图中选择一个需要检测的对象,将该对象的所有引用压栈,如此反复直到栈变空为止。栈变空意味着已经遍历了这个局部根(或者说是树图中的节点)能够到达的所有对象。树图节点范围包括局部变量(实际上局部变量会很快被回收,因为它的作用域很明显、很好控制)、寄存器、静态变量,这些元素都要重复这个操作。一旦完成,便逐个对象地检查内存,没有标记的对象变成了垃圾。  “清除”本领——回收内存:启用Compact算法,对内存中存活的对象进行移动,修改它们的指针,使之在内存中连续,这样空闲的内存也就

6、连续了,这就解决了内存碎片问题,当再次为新对象分配内存时,CLR不必在充满碎片的内存中寻找适合新对象的内存空间,所以分配速度会大大提高。但是大对象(largeobjectheap)除外,GC不会移动一个内存中巨无霸,因为它知道现在的CPU不便宜。通常,大对象具有很长的生存期,当一个大对象在.NET托管堆中产生时,它被分配在堆的一个特殊部分中,移动大对象所带来的开销超过了整理这部分堆所能提高的性能。  Compact算法除了会提高再次分配内存的速度,如果新分配的对象在堆中位置很紧凑的话,高速缓存的性能将会得到提高,因为一起分配的对象经常被一起

7、使用(程序的局部性原理),所以为程序提供一段连续空白的内存空间是很重要的。  2.代龄(Generation)  代龄就是对Heap中的对象按照存在时间长短进行分代,最短的分在第0代,最长的分在第2代,第2代中的对象往往是比较大的。Generation的层级与FrameWork版本有关,可以通过调用GC.MaxGeneration得知。  通常,GC会优先收集那些最近分配的对象(第0代),这与操作系统经典内存换页算法“最近最少使用”算法如出一辙。但是,这并不代表GC只收集最近分配的对象,通常,.NetGC将堆空间按对象的生存期长短分成3代:

8、新分配的对象在第0代(0代空间最大长度通常为256K),按地址顺序分配,它们通常是一些局部变量;第1代(1代空间最大长度通常为2MB)是经过0代垃圾收集后仍然驻留在内存中的对象,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。