crl为了管理托管堆的内存分配和回收问题。设计了垃圾回收机制。
首先,引用类型在托管堆上分配内存。clr假设该堆是无限大的。在应用程序加载的时候进行初始化,关闭的时候进行回收。
但是,堆再大也是有限度的。当托管堆被用完的时候,clr就开始进行垃圾回收。
clr内部保存一个所有对象地址的列表,它会定期检查该表的中的对象,首先假设所有对象都没有被引用
然后检查对象是否被一些跟引用,如果是,放弃如果不是就标记为垃圾。等待回收。
没有被回收的,升级为第一代垃圾。
clr为第一代垃圾分配有限的空间。当该空间被用完时,回收第一代垃圾,从而减少垃圾回收的次数。
被剩下的对象升级为第二代。
clr垃圾共三代。
垃圾回收把程序员从内存管理的繁琐工作中解放出来。
对应托管程序的类型不用程序员自己管理内存。但是对应托管程序使用的本地资源,也就是非托管资源,如i/o操作使用的类型、数据库连接等。
垃圾回收不能对非托管资源进行回收,因此使用该类资源的时候需要手动释放这些资源。
如:
public class Test:IDispose
{
//本地资源,句柄
IntPtr res;
public Test(IntPrt r)
{
res=r
}
public void Dispose()
{
res=IntPtr.Zero;
}
}