本文主要是介紹幾種垃圾收集算法的基本思路,包括標記-清除算法、複製算法、標記整理算法、分代收集java
分爲「標記」和「清除」兩個步驟,先標記全部須要回收的對象,再統一進行清除被標記的對象。算法
將內存分爲兩塊大小相等的區域,每次只使用其中的一塊來分配內存,當其中一塊內存空間用完了,觸發GC時,將仍然存活的對象複製到另外一塊內存上,再將使用過的內存一次性清理掉。spa
如今的商業虛擬機都採用複製算法來回收新生代,因爲新生代的對象存活率很低,因此將內存空間劃分爲Eden區和兩個Survivor區,每次分配內存都在Eden區和其中一個Survivor區進行。當發生垃圾回收時,將Eden和Survivor區中存活的對象複製到另外一個Survivor區,而後直接清空剛纔兩個區。
hotspot虛擬機提供的Eden和Survivor空間的默認比例爲8:1,即最多隻會浪費10%的內存空間。通常來講,新生代對象死亡率達到98%,可是不能保證特殊狀況。因此,若是另一塊Survivor空間沒有足夠空間存放上一次新生代收集下來的存活對象時,對象將經過分配擔保機制進入老年代。對象
標記過程與「標記-清除」算法相同,而後讓全部的存活對象朝着一端進行移動,以後直接將存活對象以外的內存空間進行清理。blog
分代收集算法不算一種回收算法,相似於多種算法的綜合使用。分代收集算法的思路主要是:按照對象存活時間,將內存劃分爲不一樣的區域,通常來講,將java堆劃分爲新生代和老年代,這樣能夠根據不一樣區域的對象的特色來採用最適當的收集算法。例如新生代對象死亡率高,則採用複製算法;老年代對象存活率高,而且沒有多餘內存空間作分配擔保,則採用「標記-清除」或「標記-整理」進行算法收集。內存