一、標記-清除演算法
標記清除演算法是最基礎的收集演算法,執行過程就名字一樣,分為兩個階段,標記和清除
首先對需要回收的物件進行標記,標記完成後統一對已標記物件進行回收,如下圖所示。
具體標記過程的介紹可以看上一篇垃圾收集之判斷物件存活演算法中的「可達性分析」中介紹的
前狀態
##
# 不足:
1.效率不高,標記和清除兩個動作的效率均不是太高
2.從圖中可以看到,清除後內存可以看到,清除後內存中會存在大量碎片,這樣帶來的壞處就是在給大物件分配記憶體空間時
可能導致找不到足夠大的連續空間,而導致提前發生一次GC。
二、複製演算法 複製演算法是原理是把記憶體空間分成大小相同的兩份,當需要進行垃圾收集時,將使用完的記憶體中的存活物件
複製到另一塊記憶體上,之後將前面那塊記憶體清空。如下圖所示
##
# #回收回收後狀態
#
優點:複製演算法的效率不足:
優點:複製演算法較高的效率不足:
## 優點演算法犧牲的空間較大,畢竟要講記憶體可使用空間變為了原來的一半 三、標記整理演算法這是一種在老年代常用的演算法,因為老年代物件存貨時間長。
標記整理演算法標記過程與標記-清理演算法一致,但後續步驟不同,標記整理演算法是將存活物件向一端移動,
# 接著清理掉存活端邊界另一端的所有內存,如下圖
#前狀態
#
#四、分代收集演算法
目前的虛擬機器都是使用的分代收集演算法,這種演算法是按物件的存活週期不同將記憶體劃分為不同區域 一般把java堆分為新生代與老年代
五、新生代的演算法使用
################################################################## ####### 商業虛擬機中,都是使用複製演算法對新生代進行垃圾回收,原因是新生代中的物件98%存活時間很短暫,######因此,也不需要將記憶體分為同樣大小的兩塊,只需給存活對象留出較小空間用於複製即可。因此,通常將######記憶體分為較大的Eden區和兩塊較小的survivor區,當回收時,將eden區和survivor區的存活物件複製到另一塊###### survivor區,然後對eden和使用過的servivor進行清理即可。 ###
以上是JVM高階特性-垃圾收集演算法教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!