垃圾回收算法

java虛擬機在進行內存回收時會在對象所處的時期不一樣而採用不一樣的垃圾回收算法,這裏記錄一下幾種算法的實現與思想。java

標記-清除算法

這是一個基本的算法,這個算法出現以後的算法都是由他改良而來。標誌-清除算法有兩個階段,分別是標誌和清除。
首先標誌出全部須要回收的對象,在標誌完成後統一回收全部被標誌的對象。
可是這個算法有兩個問題。第一,標誌-清除兩個過程效率不高;第二,標誌清除以後會產生大量不連續的碎片,若是存在一個大對象須要分配空間時,可能會沒有足夠大的空間予以分配。算法

複製算法

將可用內存按容量分爲大小相等的兩塊,每次使用其中的一塊。當這一塊內存用完了,就將還存活着的對象複製到另一塊去。而後把已使用過的空間一次清零,這就避免了內存碎片的問題。這個算法的優勢是運行高效,實現簡單;可是缺點也很明顯,將內存縮減爲了原來的一半。
在虛擬機對複製算法的使用中,並非把容量分紅大小相等的兩塊,而是按照8:1的比例劃分爲兩個空間,Eden和Survivor空間。Survivor空間有兩個,每次使用Eden空間和一塊Survivor。但回收時,一次性將Eden和Survivor中還活着的對象一次性複製到另外一個Survivor上面,而後在清理掉Eden空間和剛纔使用的Survivor空間。
該算法在對象存活率較高的時候須要進行不少的對象複製操做,效率將會變低。對象

標誌-整理算法

標誌過程與標記-清除算法同樣,可是後續步驟不是直接對可回收對象進行清理,而是讓全部存活的對象向一端移動,而後清理掉端邊界之外的內存。該算法應對與對象存活率較高的狀況。內存

分代收集算法

當前商業虛擬機都是用分代收集算法來進行內存回收。該算法根據對象存活的週期將內存劃分爲幾塊,通常是把java堆分爲新生代和老年代。在新生代中,被建立的對象大多數「朝生夕死」,存活率不高,因此這個區域使用複製算法;而老年代中對象存活率高,沒有額外空間,因此必須使用標誌-整理算法或者標誌-清除算法虛擬機

相關文章
相關標籤/搜索