.NET Dispose() 解決資源不足的問題

如果有可能佔用較大記憶體或資源的類別,在設計時就可以加上IDisposable介面,也就會提供Dispose()方法,在Dispose()方法中將你會用到的所有物件設為null即可。

.NET的GC(Garbage Collection)雖會自動回收,但是回收的時機是開發者無法掌控的,在PC上如果要強制回收,可以使用System.GC.Collect()來強制回收。

我曾經做過System.GC.Collect的測試,寫了一個class,其中一個方法會利用很長的字串佔用一大塊記憶體(數十MB),在 class的Dispose()中把所有變數都設為null,然後由主程式呼叫這個class,再以Task Manager觀察記憶體變化。實驗結果,即使呼叫Dispose()仍無法立即釋放class所佔用大塊記憶體空間,其中一次我等了十分鐘... 都還沒動靜!

但是如果在Dispose()最後加上System.GC.Collect(),就會立即回收!

這樣的現象對於程式或網頁執行時,如果連線數增加或佔用資源增多時,容易發生資源不足的情形!

所以用System.GC.Collect(),可以要求立即回收,不過System.GC.Collect()應該也是會等到程式安全穩定的狀態下才做動作。

string, connection等物件都是藉由reference指向Heap空間,因此自己再將這些物件變數設為null,等於切斷了指向原位址的連結,在呼叫GC.Collect()去檢查哪些是已經沒用的空間再予以回收。

因此以OO的角度來看,如果你的某個物件類別可能會佔用較多資源,就實作個Dispose(),在其中把所用的物件變數都設為null,最後加上GC.Collect()要求立即回收,這樣這個類別比較不會造成使用上資源不足的情形。