淺談C#垃圾回收理解C#垃圾回收機(jī)制我們首先說(shuō)一下CLR(公共語(yǔ)言運(yùn)行時(shí),Common Language Runtime)它和Java虛擬機(jī)一樣是一個(gè)運(yùn)行時(shí)環(huán)境,核心功能包括:內(nèi)存管理、程序集加載、安全性、異步處理和線程同步。 CTS(Common Type System)通用類型系統(tǒng),它把.Net中的類型分為2大類,引用類型與值類型。.Net中所有類型都間接或直接派生至System.Object類型。所有的值類型都是System.ValueType的子類,而System.ValueType本身卻是引用類型。
非托管資源:
在.Net中釋放非托管資源主要有2種方式,Dispose,F(xiàn)inalize Dispose方法,對(duì)象要繼承IDisposable接口,也就會(huì)自動(dòng)調(diào)用Dispose方法。 Class Suifeng:System.IDisposable { #region IDisposable 成員 public void Dispose() { // } #endregion } Suifeng suiFeng= new Suifeng (); suiFeng.Dispose(); 也可以使用Using語(yǔ)句 (using Suifeng suiFeng= new Suifeng()) { // } Finalize()方法 MSDN上的定義是允許對(duì)象在“垃圾回收”回收之前嘗試釋放資源并執(zhí)行其他清理操作。
protected override void Finalize() { try { // Cleanup statements... } finally { base.Finalize(); } }
Public class BaseResource:IDisposable { PrivateIntPtr handle; // 句柄,屬于非托管資源 PrivateComponet comp; // 組件,托管資源 Privateboo isDisposed = false; // 是否已釋放資源的標(biāo)志 PublicBaseResource { } //實(shí)現(xiàn)接口方法 //由類的使用者,在外部顯示調(diào)用,釋放類資源 Public void Dispose() { Dispose(true);// 釋放托管和非托管資源 //將對(duì)象從垃圾回收器鏈表中移除, // 從而在垃圾回收器工作時(shí),只釋放托管資源,而不執(zhí)行此對(duì)象的析構(gòu)函數(shù) GC.SuppressFinalize(this); } //由垃圾回收器調(diào)用,釋放非托管資源 ~BaseResource() { Dispose(false);// 釋放非托管資源 } //參數(shù)為true表示釋放所有資源,只能由使用者調(diào)用 //參數(shù)為false表示釋放非托管資源,只能由垃圾回收器自動(dòng)調(diào)用 //如果子類有自己的非托管資源,可以重載這個(gè)函數(shù),添加自己的非托管資源的釋放 //但是要記住,重載此函數(shù)必須保證調(diào)用基類的版本,以保證基類的資源正常釋放 Protectedvirtual void Dispose(bool disposing) { If(!this.disposed)// 如果資源未釋放 這個(gè)判斷主要用了防止對(duì)象被多次釋放 { If(disposing) { Comp.Dispose();// 釋放托管資源 } closeHandle(handle);// 釋放非托管資源 handle= IntPtr.Zero; } this.disposed= true; // 標(biāo)識(shí)此對(duì)象已釋放 } } 參考了MSDN和網(wǎng)上的一些資料,第一次寫(xiě)博文請(qǐng)各位大俠多多指點(diǎn)!
|
|