在
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框架提供面向垃圾收集的構架
將開發者從內存整理工作中解脫出來
這時
開發者只需要管理他使用過某些資源
因此使得工作變得簡易同時提高了工作效率
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25952.html