作為.NET進階內容的一部分,垃圾回收器(簡稱GC)是必須了解的內容。本著“通俗易懂”的原則,本文將解釋CLR中垃圾回收器的工作原理。
基礎知識
托管堆(Managed Heap)
先來看MSDN的解釋:初始化新進程時,運行時會為進程保留一個連續的地址空間區域。這個保留的地址空間被稱為托管堆。
“托管堆也是堆”,為什么這樣說呢?這么說是希望大家不要被“術語”迷惑,這個知識點的前提是“值類型和引用類型的區別”。這里假設讀者已經知道“值類型存儲在棧中,引用類型存儲在堆中。(引用類型的引用存儲在棧中)”這一重要概念。所以,根據這個理論,除值類型外,CLR要求所有資源都從托管堆分配。
托管堆維護著一個指針,這里命名為NextObjPtr,它指向下一個對象在堆中的分配位置。

CPU寄存器(CPU Register)
這個是計算機基礎知識,這里復習一下,有助于對下面“根”概念的理解。
CPU寄存器是CPU自己的”臨時存儲器”,比內存的存取還快。按與CPU遠近來分,離得最近的是寄存器,然后緩存(計算機一、二、三級緩存),最后內存。
根(Roots)
類中定義的任何靜態字段,方法的參數,局部變量(僅限引用類型變量)等都是根,另外cpu寄存器中的對象指針也是根。根是CLR在堆之外可以找到的各種入口點。

對象可達與不可達(Objects reachable and unreachable)
如果一個根引用了堆中的一個對象,則該對象為“可達”,否則即是“不可達”。
垃圾回收的原因
從計算機組成的角度來講,所有的程序都是要駐留在內存中運行的。而內存是一個限制因素(大小)。除此之外,托管堆也有大小限制。如果托管堆沒有大小限制,那C#的執行速度要優于c了(托管堆的結構讓它有比c運行時堆更快的對象分配速度)。因為地址空間和存儲的限制因素,托管堆要通過垃圾回收機制,來維持它的正常運作,保證對象的分配,不會“內存溢出”。
垃圾回收的基本原理
回收分為兩個階段: 標記 主站蜘蛛池模板: 青田县| 潼关县| 化州市| 鄄城县| 肇源县| 杭锦后旗| 安平县| 武隆县| 新乡县| 丰原市| 东至县| 揭阳市| 台中县| 华坪县| 榆林市| 岑溪市| 沙洋县| 扬中市| 冀州市| 永平县| 乐业县| 湖口县| 灵寿县| 浙江省| 宁乡县| 嘉义市| 桐乡市| 城口县| 富宁县| 谢通门县| 华阴市| 洛扎县| 洛隆县| 五指山市| 云龙县| 宁武县| 潍坊市| 札达县| 华池县| 甘肃省| 罗甸县|