垃圾回收机制

一、简介

   GC是Dotnet 内存管理的机制,GC负责内存的分配和回收。 

二、GC概念

     在以往,程序员都需要自己分配、释放资源。很多程序上的错误都因为内存没有释放导致。Dotnet的GC(垃圾收集)机制就让程序员从内存管理的繁琐工作中解放出来,从而专注于业务逻辑的开发。

三、实现

     1)内存分配

         所有引用类型都从堆中分配。堆可以看做一块连续的内存块。

    2)内存回收

       当程序请求分配内存时,GC会去堆查看是否还有足够的内存分配;如果不够,则进行内存回收。首先,它会遍历所有的根(全局、静态变量指针,堆栈中局部遍历指针,CPU存储器等)查找出在堆中所有还在被使用的对象,建立一张图。接着,压缩内存,把分散的、还在使用的内存合并移动要一块连续的内存块中,修正根的引用,重指向移动后的内存块。接着,对已分配、已没被使用的内存进行回收。

 

reference:http://www.cnblogs.com/tylerdurdon/archive/2008/12/17/1356853.html

 

EG:

 

 

Code

 

--------------------------------------

 

上面已经对GC的概念和简单实现有了写介绍。

现在我聊聊GC的Finalize()方法。

     类object是.net架构中的其他类的一个基类,它的成员方法Finalize的作用是来保护类型。

     如果.net的运行时垃圾收集器打算将一个对象从内存中移除,就会调用该对象的撤消方法Finalize,以释放系统资源。

     每个需要清楚的对象都必须执行撤消。但是Finalize方法会影响性能:

            垃圾收集器并不按照一定的顺序来撤销对象,也并不保证每一个对象的撤销方法都能被正确的调用。

            如果被应该撤销的对象调用了一个暂时还不能撤销的对象,这个对象也不能撤销。

            如果同时有大量的对象要等待撤销,这将会极为耗费系统资源。。。。。

      所以,为了优化性能,在必须使用Finalize方法时,你可以重载方法Close,在要清除对象时就需要调用Close方法,从而强迫垃圾收集器调用清除对象,把该对象设为null。

     调用GC.SupressFinalize()方法,可以为你代码中的元数据设置一个标记,以告诉GC在运行时不要撤销这个类。这样,就可以在对象已没用的时侯立即释放它。

 

 

转自:http://www.cnblogs.com/xl696128/archive/2009/01/07/1371312.html

posted @ 2009-01-08 09:29  IamV  阅读(481)  评论(0)    收藏  举报