垃圾回收-垃圾收集算法

標記-清除算法

    標記-清除算法爲最基礎的垃圾收集算法。首先分爲標記和清除兩個階段,首先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象。

 

缺陷:1.效率問題:標記和清除兩個過程效率都不高

2.空間問題:清除之後會存在大量的不連續的內存碎片,碎片太多,導致需要存儲較大對象時找不到連續的內存而不得不提前觸發垃圾收集。

 

複製算法:

爲了解決標記清除的效率問題,出現了複製算法。它將可用的內存分爲容量大小相等的兩塊,每次只使用其中的一塊,當這一塊用完時,就將還活着的對象複製到另一塊上面,然後將已使用過的空間一次清理掉。

缺陷:將內存縮小爲原來的一半,代價太高

 

     現在的商業虛擬機新生代都是用複製算法來收集的,ibm公司的專門研究表明,新生代的對象98%是朝生夕死的,所以不需要安裝1:1的比例來劃分內存空間。而是將內存分爲較大的eden空間和兩塊較小的survivor空間,他們的比例是8:1:1.當回收時,將eden中和survivor中還活着的對象一次性複製到另一個survivor空間上,然後清理掉eden區和剛纔用過的survivor區。

    我們沒有辦法保證每次回收都有不多於10%的對象存活,當survivor空間不夠用時,需要依賴其他內存進行分配擔保。這裏指老年代。

標記-整理算法

複製收集算法在對象存活率較高時就要進行較多的複製操作,效率將會變低。如果不想浪費50%的空間,以應對被使用的內存中所有對象都100%存活的極端情況,所以在老年代一般不能選用這種算法。

根據老年代的特點,有人提出了另外一種標記-整理算法。是基於標記清除算法實現的,但是後續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然後直接清理掉其他的內存。

 

分代收集算法

當前商業虛擬機的垃圾收集都採用分代收集,根據對象存活週期的不同將內存劃分爲幾塊。Java將堆分爲新生代,老年代,然後根據每一塊的特性讓他們採用最適合的算法。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章