在.NET中,內存管理是自動進行的。內存的再收集屬于后臺任務,這使開發者們更專注于手邊的工作。在這篇文章中,我們來看一看為開發者提供幫助并且控制垃圾收集的接口。
處理設計模式(Dispose design pattern): IDisposable, Dispose, Finalize
共同語言運行時(CLR)無法清理數據庫連接、窗口句柄、文件句柄一類的資源。因此,為開發者提供清理這類難管理的資源的機制是很有必要的。清理工作可以在Finalize方法中實現,Finalize方法在C#語言中被實現為垃圾破壞者。該方法的調用在垃圾收集器的控制下進行。
通常,你會需要一個確定的方法來清理像文件句柄一類難管理的資源。例如,現在你打開了一個文件進行寫操作,當你結束將文件內容載入緩沖器后,你可能需要明確的關閉文件句柄。對于這類顯式清理,.NET提供了處理設計模式(dispose design pattern)
需要進行顯示清理的對象需實現IDisposable接口。IDisposable接口提供了Dispose方法,該方法不像Finalize方法,它不在開發者的控制之下。
既然Dispose方法的調用是顯示清理,使用垃圾收集器收集這些對象沒有必要。因此Dispose方法應該包含一個對GC.SuppressFinalize()的調用,提示垃圾收集器在這個對象上不需要使用Finalize方法。
推薦在一個需要進行顯示清理的對象上同時實現Finalize 和Dispose方法。Finalize方法在Dispose方法沒有被調用時提供一個備份的機制。垃圾收集器將執行對象的終結和防止難管理的資源的永久性泄漏。

在 Listing A中的代碼片斷更清晰的描述了這些概念。
在Listing A中,SampleClass類使用了一個文件句柄,這是一個難管理的資源。因此,應為該對象實現IDisposable接口和提供Finalize方法。
用來清理文件句柄的代碼是Dispose方法的一部分。GC.SuppressFinalize()在難管理資源被清除時也將被調用。
該類同時提供了垃圾破壞器(Finalize方法),也包含了用于清理難管理資源(文件句柄)的代碼。
弱引用
.NET框架提供了另一有趣的特色,被用于實現多樣的高速緩存。在.NET中弱引用通過System.WeakReference類實現。弱引用為引用的對象提供一項機制,使被引用的對象能夠被垃圾收集器作用。ASP.NET高速緩存就使用了弱引用。如果內存使用率太高,高速緩存將被清除。
強制垃圾收集
.NET框架為開發者提供System.GC類來控制垃圾收集器的一些方面。垃圾收集可以通過調用GC.Collect方法強制執行。通常建議不要手動的調用垃圾收集器,而將其設置為自動方式。在某些情況下,開發者會發現強制垃圾收集將推進性能。但是,使用這個方法需要非常小心,因為在垃圾收集器運行時將延緩當前執行的線程。GC.Collect方法不應位于可能被經常調用的地方。這樣做將使應用程序的性能降級。
.NET中的服務器和工作站版本
.NET構架包括相同的CLR的兩種版本,分別對應于特定的目的。將他們分類為服務器運行時和工作站運行時,并分別在mscorsvr.dll和mscorwks.dll中實現。服務器版的CLR利用多處理技術使垃圾收集可以并行的完成。在單處理器環境使用工作站版本而不能使用服務器版本。
同樣,對于垃圾收集器有高級設置項:concurrent garbage collection和nonconcurrent garbage collection。nonconcurrent設置用于服務器環境,這時應用程序無需做出響應。Concurrent設置使用在客戶端環境中,這時用戶界面被顯示且應用程序需做出響應

Microsoft在Visual Studio.NET項目模塊上創建了一些缺省設置,ASP.NET應用程序能夠利用多處理器與裝載CLR的服務器版本。但是,由于Windows客戶端通常是胖客戶端,它將裝載CLR的工作站版本。
可以使用CorBindToRuntimeEx API來覆蓋這些設置和控制在多處理器環境中將加載哪種版本的CLR
工作效率
在兩種版本的CLR中配合使用處理設計模型,開發者可以清理難于管理的資源。.NET框架提供面向垃圾收集的構架,將開發者從內存整理工作中解脫出來。這時,開發者只需要管理他使用過某些資源,因此使得工作變得簡易同時提高了工作效率。
文章來源于領測軟件測試網 http://www.kjueaiud.com/