垃圾收集算法

標記--清除算法(Mark-Sweep)

算法分爲標記和清除兩個階段:
首先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象。
不足:第一點,效率問題,標記和清除兩個過程的效率都不高
                    第二點,空間問題,標記清除之後會產生大量不連續的內存碎片,空間碎片太多可能導致以後在程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不    得不提前觸發另一次垃圾收集動作。

複製收集算法(Copying)

爲了解決標記--清除算法的效率問題,將可用的內存按容量劃分爲大小相等的兩塊,每次只使用其中的一塊,當這一塊的內存用完了,就將還存活着的對象複製到另外一塊上面,然後再把已使用過的內存空間一次清理掉。這樣使得每次都是對整個半區進行內存回收,內存分配時也就不用考慮內存碎片等複雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。
不足:將內存縮小爲原來的一半,代價太高。


採用此種收集算法來回收新生代,將內存分爲一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中的一塊Survivor。當回收時,將Eden和Survivor中還存活着的對象一次性地複製到另外一塊Survivor空間上,最後清理掉Eden和剛纔用過的Survivor空間。HotSpot虛擬機默認Eden和Survivor的大小比例是8:1,即每次新生代中可用內存空間爲整個新生代容量的90%(80%+10%),只有10%的內存會被浪費。如果另外一塊Survivor空間沒有足夠空間存放上一次新生代收集下來的存活對象時,需要依賴老年代進行分配擔保(Handle Promotion)。

標記--整理算法(Mark--Compact)

複製收集算法在對象存活率較高時就要進行較多的複製操作,效率將會變低。所以標記--整理算法更適合於老年代。
原理:讓所有存活的對象都向一端移動,然後直接清理掉端邊界以外的內存。


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