算法分爲兩個步驟:首先標記出全部須要回收的對象,在標記完成後統一回收全部被標記的對象。算法
方法不足:3d
(1)標記和清除兩個過程的效率都不高。對象
(2)標記清除後對產生大量的內存碎片,致使程序分配較大的對象時,沒法找到足夠的連續內存而不得不提早觸發一次垃圾收集動做。blog
將內存分爲兩塊,每次只使用其中的一塊,當這一塊內存用完了,就將還活躍的對象移到另外一塊內存上,而後把已使用的內存一次性清理,這樣是對內存半區進行內存回收,內存分配時也不用擔憂內存碎片等問題。內存
現代的虛擬機都採用這種算法來回收新生代,可是不是將內存分紅兩塊,而是將內存分紅一塊較大的Eden區和兩塊survivor區,每次使用Eden區和一塊survivor區,在回收時,將Eden區和一塊survivor區中還活着的對象複製到另外一塊survivor區,最後清理Eden區和那塊survivor區。虛擬機
當另一塊survivor區沒有足夠的內存存放上一次新生代收集的下來的存活對象,就須要老生代進行分配擔保。即這些對象直接進入老年代。效率
該算法使用在老年代,標記過程和標記-清除算法同樣,不一樣的是收集階段,是讓全部存活的對象都向一端移動,而後直接清理掉邊界之外的內存。程序
現代的商業虛擬機都採用分代收集算法進行垃圾收集,它根據對象的存活期將內存分爲幾塊,不一樣的塊,採用不一樣的收集算法。方法
新生代:複製。im
老年代:標記-清除或者標記-整理。