天天看點

C# 資源釋放

資源

資源分2種 托管資源 和 非托管資源

非托管資源: 所有的Window核心對象(句柄)都是非托管資源,如Stream,資料庫連接配接,GDI相關對象,還有Com對象等等。這些資源并不是收到CLR管理

托管資源:由CLR管理配置設定和釋放的資源,即由CLR裡new出來的對象。

非托管資源:需要顯式釋放的,也即需要你寫代碼釋放

托管資源:并不需要顯示釋放,但是如果引用類型本身含有非托管資源,則需要進行現實釋放

釋放資源的方法

1:實作IDisposable接口的Dispose方法;

2:析構方法(終結器);

3:提供顯示釋放方法,比如常用的Close方法;

托管對像的生命周期

1.當我們建立一個對象的時候,運作構造函數,為其配置設定一塊記憶體,我們稱之為一個活對象。

2.當一個對象或者它的任何部分在後續的程式執行過程中不再可能被通路的時候,它就被視為不再被使用的對象,滿足了銷毀的條件,GC就會做出判斷,該對象是否滿足回收的條件,之後開始幹活,你懂得。

3.當GC覺得你這個對象應該挂了,他就會啟動這個對象的自殺式武器(如果該對象有析構函數)來自我結果,至于他什麼時候要你挂,完全要看他的心情,或許就是她覺得你這個對象沒什麼利用價值了,正所謂飛鳥盡良弓藏。

4.當你這個對象運作析構函數(要挂)的時候,可能在存在運作析構函數的時候在析構函數内部重新指向了一個對象的情況。是以隻有當該對象包括在析構函數的一切後續程式中都在沒有可能被通路的時候GC才會認為是滿足了回收條件。

5.當對象滿足被回收的條件的時候,GC就會釋放對象所占的所有記憶體。

能否自己控制垃圾回收? 

  說到這裡我們是否考慮到能否自己控制垃圾回收呢,答案是肯定的,我們可以使用GC類提供的GC.Collect方法來使應用程式在一定程度上直接控制垃圾回收器,但是一般不要去手動幹預GC。沒有特殊理由,不要去調用GC.Collect(),讓它自己決定什麼時候去回收記憶體。還是人家的比較嚴謹。

是的,我們可以在确定某個時間點的記憶體使用量大量減少的時候叫服務員過來收一下盤子(GC.Collect()一下),但是如果我們頻繁的叫服務員過來清理垃圾是不是會影響我們吃飯呢,這就好比,服務員過來收拾垃圾,對大家說,先生們先别吃請擡一下手,我先擦一下桌子,接着剛又下手吃的還沒盡興,又  

  有個同桌小妞叫服務員有過來收拾垃圾,又說先生們再擡一下手,姐又要收拾下空盤子...!#$@,你妹呀,自己喊過來喊過去的,原來還是很影響自己吃飯呀,以後一定要有個約定積累到一定的量在叫服務員過來服務,這樣還不如用他們店裡自己的回收垃圾規則啊,人家畢竟是幹這行的,顧客至善,人家啥時候來GC那才叫專業。是以還是在遇到服務員開小差le再去叫她,一般不要主動叫啦。

  這個叫小姐過來服務的的過程她會要我們先停手,這就可以很好了解,在垃圾回收器執行回收之前,它會挂起目前正在執行(吃)的所有線程。如果不必要的多次進行GC.Collect()方法,則可能(影響吃飯)降低程式執行的性能。進而人為地削弱了垃圾回收器本身優化引擎的作用。