4、垃圾收集之垃圾收集算法
1、標記-清除算法
- 最基礎的收集算法,其他的算法基本都是由此算法改進得來
- 效率不高,標記和清除的過程效率都不高
- 清除以後會產生大量的不連續的內存碎片
2、複製算法
- 爲了解決標記-清除算法的效率問題而出現的複製算法
- 將內存分爲兩塊,一個半區用於放對象,另外一個半區是空的
- 垃圾回收時將放置對象的半區中未被標記死亡的對象放到空半區
- 這樣的好處在於實現簡單,運行高效
- 缺點是犧牲了通常的內存空間,代價太大
3、如今的複製算法
- HotSpot虛擬機採用Eden-Survivor分區的方式
- 將內存分爲Eden空間和兩塊Survivor空間,大小爲8 : 1 : 1
- 回收時將Eden空間和一塊Survivor空間中還存活的對象複製到另外一個Survivor空間中
- 這樣作的緣由是由於:98%的新生代都是「朝生夕死」的,因此每次回收的時候能夠將存活的對象放到較小的一塊區域
- 當另外一塊Survivor空間沒有大小不夠時,虛擬機會經過分配擔保機制將這些對象划進老年代
4、標記-整理算法
- 在老年代中通常都是存活時間比較長的對象,因此不適合使用複製算法進行回收(基本不會「朝生夕死」)
- 標記-整理算法會將全部存活的的對象都像一端移動,而後清理掉邊界之外的內存
5、分代回收算法
- 當前商業虛擬機的垃圾收集都採用分代回收算法
- 將內存劃分爲幾塊,通常是把java堆分紅新生代和老年代,根據各個年齡代的特色,選擇不一樣的算法進行回收
- 新生代通常是「朝生夕死」,因此採用複製算法,高效且不須要很大的空閒內存
- 老年代的對象存活率高,因此使用標記-清除算法或者標記-整理算法
歡迎關注本站公眾號,獲取更多信息