自己理解的gc演算法
1、引用計數法
為每一個物件配備一個整型計數器。對於一個A物件,只要有任何一個物件引用了A,則A的引用計算器就加1,當引用失效時,引用計數器減1.只要A的引用計數器值為0,則物件A就不可能再被使用。
缺點:1)無法解決迴圈引用問題 2)計數器加減操作影響效能
2、標記清除法
通過根節點,標記所有從根節點開始的可達物件,因此
缺點:存在碎片,回收後的記憶體空間不再連續。在物件的對空間分配過程中,尤其是大物件的記憶體分配,不連續記憶體空間的工作效率要低於連續空間的
3、複製演算法
將原有的記憶體空間分為兩塊相同的儲存空間,每次只使用一塊,在垃圾回收時,將正在使用的記憶體塊中存活物件複製到未使用的那一塊記憶體空間中,之後清除正在使用的記憶體塊中的所有物件,完成垃圾回收。
優點:物件多時,效率高,不存在碎片
缺點:1)物件少時複製耗時不可取 2)儲存空間折半
4、標記壓縮演算法
和標記清除演算法一樣,標記壓縮演算法也首先從根節點開始,對所有可達的物件做一次標記,但之後,它並不是簡單的清理未標記的物件,而是將所有的存活物件壓縮到記憶體空間的一端,之後,清理邊界外所有的空間。這樣做避免的碎片的產生,又不需要兩塊相同的記憶體空間,因此價效比高。
前提:物件比較少時 適用:老年代
新生代物件:存放年輕物件的堆空間,年輕物件指剛剛建立,或者經歷垃圾回收次數不多的物件。
老年代物件:存放老年物件的堆空間。即為經歷多次垃圾回收依然存活的物件。
5、分代演算法
新生代物件朝生夕滅,大約90%的物件會很快回收,因此,新生代比較適合使用複製演算法。
老年代的存活率是很高的,使用標記清除或者標記壓縮演算法可以提高垃圾回收效率。
分代的思想被現有的虛擬機器廣泛使用
為了支援高頻率的新生代回收,虛擬機器可能使用一種叫做卡表的資料結構,卡表為一個位元位集合,每一個位元位可以用來表示老年代的某一區域中的所有物件是否持有新生代物件的引用,卡表中每一位表示老年代4KB的空間,卡表記錄為0的老年代區域沒有任何物件指向新生代,只有卡表為1的區域才有物件包含新生代物件的引用,因此在新生代GC時,只需要掃面卡表為1所在的老年代空間,使用這種方式,可以大大加快新生代的回收速度。
6、分割槽演算法
分割槽演算法將整個堆空間劃分為連續的不同小區間,
堆空間越大,一次GC所需的時間就越長,從而產生的停頓時間就越長。為了更好的控制GC產生的停頓時間,將一塊大的記憶體區域分割成多個小塊,根據目標的停頓時間,每次合理的回收若干個小區間,而不是整個堆空間,從而減少一個GC的停頓時間。