1.释放内存:分配在托管堆上的引用类型实例所占的内存资源。
2.销毁资源状态,垃圾收集器并不清楚怎样执行清理工作开发人员必须编写执行这部分工资的代码这些代码一般被放在"Finalize,Dispose以及Close方法中"。
3.代龄的机制惟一目的就是提高垃圾收集的性能。
4.首先:我们不必再自己实现代码来管理应用程序中对象的生存期.
其次:应用程序将不可能再发生内存泄漏的情况。
5.任何封装了非托管资源的类型都必须支持一种称作终止化的操作.
终止化操作允许一种资源在它所占用的内存被回收之钱首先执行一些清理工作。
6.当垃圾收集器判定一个对象为可收集的垃圾时,它便会调用该对象的Finalize方法。
/*------------------------------------------------------------------*/
//隐式装换定义
public static implicit Operator Inptr(OShandle oshandle)
{
return oshandle.ToHandle();
}
7.有4种事件会导致一个对象的Finalize方法被调用
一、第0代对象充满。
二、显示调用System.GC的静态方法Collect。
三、CLR卸载应用程序集。
四、CLR被关闭。
Finalize方法调用了AppDomain的IsFinalizeingForUnload方法如果对象的Finalize方法是由于应用程序域卸载而被调用的那么该方法将返回true。
一个对象要成为终止化对象,那么在它的类型及器基类型总(除Object之外)必须至少有一个重写Object的Finalize方法。
终止化调用过程:
垃圾收集 调用
终止化链表----------------->终止化可达队列---------->Finalize------>清除终止化可达队列项-----(垃圾收集)--->释放对象内存
Dispose模式:
提供给用户多种选择(虽然它们执行代码是相同的)。
using编译器会自动产生一个try块和一个finally块在finally块中编译器会产生代码变量转型一个IDisposable接口,并调用其上的Dispose方法.using语句只能用于那些实现了IDisposeable接口的类型。
使对象复苏:
1~SomeType()
2{
3Application.Objhoder= this;
4//保证了下次销毁SomeType对象依然会调用Finalize方法
5GC.ReRegisterForFinalize(this);
6}
7
8//利用复苏设计一个对象池:
9Calss Expensive
10{
11static stack pool = new stack();
12public static Expensive GetObjectFromPool()
13{
14return (Expensive)pool.pop();
15}
16public static void StutdownThePool()
17{
18pool = NULL;
19}
20public Expensive()
21{
22pool.push(this);
23}
24~Expensive()
25{
26if(pool != NULL)
27{
28GC.ReRegisterForFinalize(this);
29pool.Push(this);
30}
31}
32}
对象的代龄:
代领是旨在提高垃圾收集器性能的一种机制。
几点假设:
一、对象越新,其生存期越短。
二、对象越老,其生存期越长。
三、对托管堆的一部分执行来及收集要比对整个拖管堆执行垃圾收集速度快。
编程控制垃圾收集器:
System.GC类型为我们的应用程序提供了直接控制垃圾收集器的一些方法:(强制执行垃圾收集)
//Generation指定收集第一代垃圾
void GC.Collect(int32 Generation);
void GC.Collect();
// 挂起调用线程直到处理终止化可达队列的线程清空了该队列
void GC.WaitForPendingFinalizers();
//确定对象所处的代龄
Int32 GetGeneration(Object obj);
Int32 GetGeneration(WeakReference wr)
并发收集:
控制面板---->管理工具------>.Net Framework Configuration---->应用程序-------->添加一个应用程序或者选择一个现存的应用程序----------->属性-------->垃圾回收模式