4、垃圾收集之垃圾收集算法

1、標記-清除算法

  1. 最基礎的收集算法,其他的算法基本都是由此算法改進得來
  2. 效率不高,標記和清除的過程效率都不高
  3. 清除以後會產生大量的不連續的內存碎片

 

2、複製算法

  1. 爲了解決標記-清除算法的效率問題而出現的複製算法
  2. 將內存分爲兩塊,一個半區用於放對象,另外一個半區是空的
  3. 垃圾回收時將放置對象的半區中未被標記死亡的對象放到空半區
  4. 這樣的好處在於實現簡單,運行高效
  5. 缺點是犧牲了通常的內存空間,代價太大

 

3、如今的複製算法

  1. HotSpot虛擬機採用Eden-Survivor分區的方式
  2. 將內存分爲Eden空間和兩塊Survivor空間,大小爲8 : 1 : 1
  3. 回收時將Eden空間和一塊Survivor空間中還存活的對象複製到另外一個Survivor空間中
  4. 這樣作的緣由是由於:98%的新生代都是「朝生夕死」的,因此每次回收的時候能夠將存活的對象放到較小的一塊區域
  5. 當另外一塊Survivor空間沒有大小不夠時,虛擬機會經過分配擔保機制將這些對象划進老年代

4、標記-整理算法

  1. 在老年代中通常都是存活時間比較長的對象,因此不適合使用複製算法進行回收(基本不會「朝生夕死」)
  2. 標記-整理算法會將全部存活的的對象都像一端移動,而後清理掉邊界之外的內存

5、分代回收算法

  1. 當前商業虛擬機的垃圾收集都採用分代回收算法
  2. 將內存劃分爲幾塊,通常是把java堆分紅新生代和老年代,根據各個年齡代的特色,選擇不一樣的算法進行回收
  3. 新生代通常是「朝生夕死」,因此採用複製算法,高效且不須要很大的空閒內存
  4. 老年代的對象存活率高,因此使用標記-清除算法或者標記-整理算法
相關文章
相關標籤/搜索