Working with Garbage Collection

.NET垃圾回收機制

記憶體管理與垃圾回收

    .NET程式最終都會在一個作業系統的處理序(process)中執行,假設這個作業系統是傳統的32位元,那每個.NET程式都可以擁有一個4GB的虛擬記憶體。.NET會在這個4GB的區塊中,分出三塊記憶體分別作為推疊(stack)、受託管的累堆(managed heap)和非託管的累堆(unmanaged heap)。

堆疊

    之前章節有提過所有的數值型別物件和參考物件的參考位址都是分配在堆疊上,堆疊則根據物件的生存周期來依序後進先出地分配和釋放,效率較高。

受託管累堆

    所有參考型別物件都分配在託管累堆上,託管累堆採用連續分配記憶體,並且受.NET垃圾收集機制管理,且記憶體分配和釋放涉及較複雜的記憶體管理,效率相對於堆疊來說低很多。

非託管的累堆

    非託管累堆不受.NET垃圾收集機制管理,需要由程式設計師手動分配和釋放。

 

GC運作機制

GC會清楚託管累堆上不再被使用的物件記憶體,並且移動使用中的物件,使它們靠攏在託管累堆的分配區。
如下圖所示,GC的執行過程會先找到不再被使用的物件B,並標示為垃圾,接下來就是移動物件C向物件A靠攏,這樣物件B的空間就被騰出來,以供下次分配使用。

一般情況下,垃圾回收會定期執行,程式設計師不需要干預,不過CLR也提供一個手動執行垃圾回收的方法GC.Collect(),呼叫後會立即執行垃圾回收,並且立即釋放記憶體。    另外請盡量避免使用GC.Collect()來執行垃圾回收,因為可能反而造成託管累堆上的物件被回收的時間點延後,無謂地增加記憶體空間的負擔。

結論

Wha is Garbage Collection

  • GC 是一個記憶體自動管理機制
  • 會自動檢查未被參考的物件且定期回收
  • GC消耗效能

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。