一個被終止的對象常駐內存重而不被使用的話,會占用很多系統資源,於是.Net的垃圾回收器就會將它放在中止化隊列中,一旦時機成熟,該對象就會被喚醒,並調用他的finalize方法,來徹底的終結他,但是利用這一機制,就可以將耗費資源的巨型類放入到一個對象池中,在程序的整個生存期內重復的使用他(結束的標志是clr認為在進程中不存在任何該應用程序的根)。我們稱這些巨型類為Expensive對象,下面來討論一下管理Expensive對象的對象池的結構。
Class Expensive{
Static Stack pool = new Stack();
Public static Expensive GetObjectFromPool(){
Retun (Expensive) pool.Pop();
}
Public static void ShutdownThePool(){
Pool = null;
}
Public Expensive(){
//先構造對象
Pool.push(this);
}
Finalize (){
If(pool!=null){
GC.RegisterForFinally(this;)//先把他叫醒挨宰
Pool.push(this);//將“清醒的”對象加入到對象池中,讓他起死回生
}
}
}
Class app{
Static void main(){
New expensive();
……
Expensive e = Expensiv. GetObjectFromPool();
//下面就可以使用e了
Expensive.shutdownThepool();//關閉應用程序前,先關閉對象池,否則會在內存中留下“孔洞”,因為Finalize已經被重寫了
}
}