一、简介
GC是Dotnet 内存管理的机制,GC负责内存的分配和回收。
二、GC概念
在以往,程序员都需要自己分配、释放资源。很多程序上的错误都因为内存没有释放导致。Dotnet的GC(垃圾收集)机制就让程序员从内存管理的繁琐工作中解放出来,从而专注于业务逻辑的开发。
三、实现
1)内存分配
所有引用类型都从堆中分配。堆可以看做一块连续的内存块。
2)内存回收
当程序请求分配内存时,GC会去堆查看是否还有足够的内存分配;如果不够,则进行内存回收。首先,它会遍历所有的根(全局、静态变量指针,堆栈中局部遍历指针,CPU存储器等)查找出在堆中所有还在被使用的对象,建立一张图。接着,压缩内存,把分散的、还在使用的内存合并移动要一块连续的内存块中,修正根的引用,重指向移动后的内存块。接着,对已分配、已没被使用的内存进行回收。
reference:http://www.cnblogs.com/tylerdurdon/archive/2008/12/17/1356853.html
EG:

Code
using System;
namespace GCCollectIntExample
{
class MyGCCollectClass
{
private const long maxGarbage = 1000;
static void Main()
{
MyGCCollectClass myGCCol = new MyGCCollectClass();
// Determine the maximum number of generations the system
// garbage collector currently supports.
Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);
myGCCol.MakeSomeGarbage();
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
// Determine the best available approximation of the number
// of bytes currently allocated in managed memory.
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
// Perform a collection of generation 0 only.
GC.Collect(0);
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
// Perform a collection of all generations up to and including 2.
GC.Collect(2);
// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
Console.Read();
}
void MakeSomeGarbage()
{
Version vt;
for (int i = 0; i < maxGarbage; i++)
{
// Create objects and release them to fill up memory
// with unused objects.
vt = new Version();
}
}
}
}
--------------------------------------
上面已经对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