垃圾收集算法

標記-清除算法

在這裏插入圖片描述
原理:首先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象。
不足:

  • 效率問題,標記和清除兩個過程效率不高
  • 空間問題,標記清除後會產生大量不連續的內存碎片,空間碎片太多可能會導致以後再程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作。

複製算法

在這裏插入圖片描述
原理:將內存按容量分爲大小相等的兩塊,每次只使用其中一塊。當這一塊的內存用完了,就將還存活的對象複製到另外一塊上面,然後再把已使用過的內存空間一次清理掉。
優點:每次都是對整個半區進行內存回收,內存分配時也就不用考慮內存碎片等複雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。
缺陷:

  • 將內存縮小爲原來的一半,代價太高。
  • 在對象存活率較高時要進行較多的複製操作,效率將會變低
  • 需要由額外內存進行分配擔保,不適用於老年代的內存回收

分配擔保

商業虛擬機都使用複製算法回收新生代,由於新生代中98%的對象生命週期都很短,故不需要按照1:1的比例劃分內存空間,而是將內存的新生代區劃分爲一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊Survivor。當回收時,將Eden和Survivor中還存活的對象一次性複製到另一塊Survivor上,最後清理掉Eden和剛剛使用過的Survivor空間。
當另一塊Survivor空間不夠存放上一次新生代收集下來的存活對象時,這些對象將直接通過分配擔保機制進入老年代。

標記-整理算法

在這裏插入圖片描述
適用於老年代。標記過程同“標記-清除”算法一樣,但後續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然後直接清理掉端邊界以外的內存。

分代收集算法

當前商業虛擬機的垃圾收集都採用分代收集算法
原理:

  • 根據對象存活週期的不同,將內存分爲幾塊。一般是把Java堆分爲新生代和老年代,根據各個年代的特點採用最適當的收集算法
  • 新生代中,每次垃圾收集時都會有大批對象死去,選用複製算法,只需付出少量存活對象的複製成本就可以完成收集
  • 老年代中對象存活率高、沒有額外空間對它進行分配擔保,就必須使用標記-清理算法或標記-整理算法進行回收
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章