CLR中的記憶體管理

2022-02-21 18:01:48 字數 1191 閱讀 9618

在c++中,令程式設計師最頭疼的是對記憶體的分配和管理。在.net下,事情容易多了。.net引用了垃圾**(gc)功能,它替代了程式設計師對於清除無用物件的工作。雖然在大多數情況下,記憶體的**我們不用再去理會,但如果能夠在程式中適時地新增一些記憶體管理的工作,可以使程式更加的優化。

由於clr(公共語言執行時)可以知道在系統中的所有物件引用,因此在執行時,gc可以獲取物件是否被引用的資訊。如果乙個物件不再被引用,則通過gc進行自動**。

不過gc**的條件是,當特定資源不夠用時才執行。如果我們希望自己控制,也可以顯示地指示gc工作。方法是:

system.gc.collect();

gc在進行**時,先會識別物件是否被引用,並標記出物件的特徵。只有不被引用的物件才被**。為避免堆碎片,gc在**了物件後,會重新分配記憶體,並對未被**的物件進行重定位。這必然導致gc在**時會導致系統執行效能的降低。

適時的進行人工干預記憶體分配,是比較好的選擇。我們知道在c++中,對於建立的類中,有相對應的析構函式進行記憶體的刪除。在c#中,也可以採用同樣的方式。當例項化乙個類物件後,刪除它,則自動呼叫其析構函式。clr提供了物件終結(object finalization)的機制,引入了finalize方法。不過在c#中,不能直接實現finalize方法,而是在析構函式中呼叫基類的finalize()方法。

gc的**機制是非同步操作,我們可以使用clr提供的dispose()方法實現對每乙個物件的刪除操作。dispose()方法由idiposable介面提供。因此對於將要例項化的類物件,實現dispose操作,必須使類實現該介面,並提供dispose()方法。

public class garbage:idisposable//實現該介面

~garbage()//析構函式;

}不過更好的方案是使用using語句。將物件的例項放到using中,一旦using結束,系統會自動清楚該物件。

using (garbage g = new garbage())

不過要注意的是在using語句中例項的物件,其類也必須要實現idisposable介面和dispose()方法。

另外,由於icomponent擴充套件了idisposable,因此icomponent型別始終是idisposable型別。所以我們開發的元件型別可以用在using中,或者使用dispose()方法。所以,系統提供的元件如dataset,datatable等的例項也可以實現這種方式來清除物件。

參考msdn和.net本質論

CLR實用特徵 自動記憶體管理 垃圾收集

20 1理解垃圾收集平台的基本工作原理 20 2垃圾收集演算法 20 3垃圾收集與除錯 一旦物件變為不可達的物件,它就成為垃圾收集器的目標 不保證物件在方法的生存期中自始自終的存活。20 4使用終結操作來釋放本地資源 20 5對託管資源使用終結操作 20 6那些事件會導致finalize方法的呼叫 ...

C 之CLR記憶體原理初探

本文初步講述了c 的clr記憶體原理。這裡所關注的記憶體裡面說沒有暫存器的,所以我們關注的只有託管堆 h程式設計客棧eap 棧 stack 字串常量池 其中string是乙個很特殊的物件 首先我們看兩個方法 void m1 void m2 string name2 這裡我們有乙個m1的方法,初始化乙...

Object C 中的記憶體管理

當你呼叫alloc init的時候,你得到乙個引用計數是1的物件。當你用完這個物件之後,你要對它呼叫release訊息,使其引用計數為0,這樣它的記憶體才會被釋放掉。當你呼叫乙個方法,它不是以init或者copy開頭的,這時,返回給你的物件是autorelease的,它是一種在將來某個時刻會自動被釋...