C#基礎-gc算法

衆所周知,c++是須要程序員手動管理內存的,然而手動釋放內存很容易被程序員遺漏,從而致使資源浪費或內存泄露。爲解決這個問題,垃圾回收器誕生了,代替程序員自動管理內存的釋放。至於gc算法則是垃圾回收器清除垃圾的方法了。html

本篇文章簡單介紹一下各個gc算法的原理和優缺點c++

GC Root

GC roots are not objects in themselves but are instead references to objects.程序員

.NET中能夠看成GC Root的對象有以下幾種:算法

一、全局變量spa

二、靜態變量code

三、棧上的全部局部變量(JIT)htm

四、棧上傳入的參數變量對象

五、寄存器中的變量blog

在Java中,能夠當作GC Root的對象有如下幾種:遞歸

一、虛擬機(JVM)棧中的引用的對象

二、方法區中的類靜態屬性引用的對象

三、方法區中的常量引用的對象(主要指聲明爲final的常量值)

四、本地方法棧中JNI的引用的對象

標記清除法

原理:從GC Root開始遞歸,對可能引用的對象進行標記,沒有標記的做爲垃圾被回收

步驟:遍歷並標記對象->回收死亡對象,清除存活對象的標記

缺點:

1.清除階段還須要對大量死亡對象進行掃描,死亡對象多的話會至關耗時

2.清理出來的內存空間不連續

標記整理法

原理:從GC Root開始遞歸,對可能引用的對象進行標記,以後移動全部存活的對象,且按照內存地址次序依次排列,而後將末端內存地址之後的內存所有回收

步驟:遍歷並標記對象->整理存活對象->回收

缺點:效率低

複製清除法

原理:遍歷GC Root引用的對象,複製到另外的空間,並遞歸地對複製對象引用的對象進行復制,以後清除舊空間

步驟:遞歸複製->廢棄舊空間

缺點:

1.複製開銷大,存活對象多耗時大

2.浪費一半的內存

引用計數法

原理:爲每一個對象保存引用計數,引用增減時更新計數

步驟:不須要掃描,對計數0的對象進行垃圾回收

缺點:

1.沒法釋放循環引用的對象

循環引用

1 A a = new A();
2 B b = new B();
3 C c = new C();
4 A.b = b;
5 B.c = c;
6 C.a = a;

2.引用計數不能遺漏

3.不適合並行處理

分代蒐集法

原理:對分配時間短的對象進行清理

好比Net,將內存中的對象分爲了三代,每執行N次0代的回收,纔會執行一次1代的回收,而每執行N次1代的回收,纔會執行一次2代的回收。當某個對象實例在GC執行時被發現仍然在被使用,它將被移動到下一個代中上。

而在mono 中是分2代

各平臺GC算法

關於Mono ,集成的是開源項目BOEHM ,BOEHM算法採用標記清除法

參考資料

《代碼的將來》讀書筆記:內存管理與GC那點事兒

垃圾回收機制GC知識再總結兼談如何用好GC

相關文章
相關標籤/搜索