天天看點

.NET 的記憶體管理機制(一)引言記憶體配置設定

引言

.NET 的記憶體管理機制,要了解首先應該從記憶體配置設定開始,也就是對象的建立環節。對象的建立,是個複雜的過程,主要包括記憶體配置設定和初始化兩個環節。例如,對象的建立過程可以表示為:

FileStream fs = new FileStream(@"C:"temp.txt", FileMode.Create);           

通過 new 關鍵字操作,即完成了對 FileStream 類型對象的建立過程,這一看似簡單的操作背後,卻經曆着相當複雜的過程和周折。

記憶體配置設定

關于記憶體的配置設定,我們先了解配置設定在哪裡的問題。CLR 管理記憶體的區域,主要有三塊,分别為:

線程的堆棧,用于配置設定值類型執行個體。堆棧主要由作業系統管理,而不受垃圾收集器的控制,當值類型執行個體所在方法結束時,其存儲機關自動釋放。棧的執行效率高,但存儲容量有限。

GC 堆,用于配置設定小對象執行個體。如果引用類型對象的執行個體大小小于 85000 位元組,執行個體将被配置設定在GC堆上,當有記憶體配置設定或者回收時,垃圾收集器可能會對GC堆進行壓縮。

LOH(Large Object Heap)堆,用于配置設定大對象執行個體。如果引用類型對象的執行個體大小不小于 850

00 位元組時,該執行個體将被配置設定到 LOH 堆上,而 LOH 堆不會被壓縮,而且隻在完全 GC 回收時被回收。

了解了記憶體配置設定的區域,接着我們看看有哪些操作将導緻對象建立和記憶體配置設定的發生,關于執行個體建立

有多個 IL 指令解析,主要包括:

newobj,用于建立引用類型對象。

ldstr,用于建立 string 類型對象。

newarr,用于配置設定新的數組對象。

box,在值類型轉換為引用類型對象時,将值類型字段拷貝到托管堆上發生的記憶體配置設定。

我們了解了這些基礎後,關于堆棧的記憶體配置設定機制我們下節再說。