.NET中的記憶體管理,GC機制,記憶體釋放過程

來源:互聯網
上載者:User

引言
作為一個.NET程式員,我們知道Managed 程式碼的記憶體管理是自動的。.NET可以保證我們的託管程式在結束時全部釋放,這為我們編程人員省去了不少麻煩,我們可以連想都不想怎麼去管理記憶體,反正.NET自己會保證一切。好吧,有道理,有一定的道理。問題是,當我們用到非託管資源時.NET就不能自動管理了。這是因為Unmanaged 程式碼不受CLR(Common Language Runtime)控制,超出CLR的管理範圍。那麼如何處理這些非託管資源呢,.NET又是如何管理並釋放託管資源的呢?

自動記憶體管理和GC
在原始程式中堆的記憶體配置是這樣的:找到第一個有足夠空間的記憶體位址(沒被佔用的),然後將該記憶體配置。當程式不再需要此記憶體中的資訊時程式員需要手動將此記憶體釋放。堆的記憶體是公用的,也就是說所有進程都有可能覆蓋另一進程的記憶體內容,這就是為什麼很多設計不當的程式甚至會讓作業系統本身都down掉。我們有時碰到的程式莫名其妙的死掉了(隨機現象),也是因為記憶體管理不當引起的(可能由於本身程式的記憶體問題或是外來程式造成的)。另一個常見的執行個體就是大家經常看到的遊戲的Trainer,他們通過直接修改遊戲的記憶體達到"無敵"的效果。明白了這些我們可以想象如果記憶體位址被用混亂了的話會多麼危險,我們也可以想象為什麼C++程式員(某些)一提起指標就頭疼的原因了。另外,如果程式中的記憶體不被程式員手動釋放的話那麼這個記憶體就不會被重新分配,直到電腦重起為止,也就是我們所說的記憶體流失。所說的這些是在Unmanaged 程式碼中,CLR通過AppDomain實現代碼間的隔離避免了這些記憶體管理問題,也就是說一個AppDomain在一般情況下不能讀/寫另一AppDomain的記憶體。託管記憶體釋放就由GC(Garbage Collector)來負責。我們要進一步講述的就是這個GC,但是在這之前要先講一下Managed 程式碼中記憶體的分配,託管堆中記憶體的分配是順序的,也就是說一個挨著一個的分配。這樣記憶體配置的速度就要比原始程式高,但是高出的速度會被GC找回去。為什嗎?看過GC的工作方式後你就會知道答案了。
GC工作方式
首先我們要知道Managed 程式碼中的對象什麼時候回收我們管不了(除非用GC.Collect強迫GC回收,這不推薦,後面會說明為什麼)。GC會在它"高興"的時候執行一次回收(這有許多原因,比如記憶體不夠用時。這樣做是為了提高記憶體配置、回收的效率)。那麼如果我們用Destructor呢?同樣不行,因為.NET中Destructor的概念已經不存在了,它變成了Finalizer,這會在後面講到。目前請記住一個對象只有在沒有任何引用的情況下才能夠被回收。為了說明這一點請看下面這一段代碼:
[C#]
object objA = new object();
object objB = objA;
objA = null;
// 強迫回收。
GC.Collect();
objB.ToString();

[Visual Basic]
Dim objA As New Object()
Dim objB As Object = objA
objA = Nothing
' 強迫回收。
GC.Collect()
objB.ToString()
這裡objA引用的對象並沒有被回收,因為這個對象還有另一個引用,ObjB。
對象在沒有任何引用後就有條件被回收了。當GC回收時,它會做以下幾步:
確定對象沒有任何引用。

相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。