自動記憶體管理

iDotNetSpace發表於2008-09-28
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方法。 
 
終止化呼叫過程: 
 
垃圾收集 呼叫 

終止化連結串列-----------------&gt終止化可達佇列----------&gtFinalize------&gt清除終止化可達佇列項-----(垃圾收集)---&gt釋放物件記憶體

 Dispose模式: 
提供給使用者多種選擇(雖然它們執行程式碼是相同的)。 
using編譯器會自動產生一個try塊和一個finally塊在finally塊中編譯器會產生程式碼變數轉型一個IDisposable介面,並呼叫其上的Dispose方法.using語句只能用於那些實現了IDisposeable介面的型別。 
 
使物件復甦: 

自動記憶體管理
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 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) 
 
併發收集: 
控制皮膚----&gt管理工具------&gt.Net Framework Configuration----&gt應用程式--------&gt新增一個應用程式或者選擇一個現存的應用程式-----------&gt屬性--------&gt垃圾回收模式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-466048/,如需轉載,請註明出處,否則將追究法律責任。

相關文章