1.標記-清除算法
標記-清除(Mark-Sweep)算法分為"標記"和"清除"兩個階段狐胎;
首先標記出所有需要回收的對象,在標記完成后統(tǒng)一回收所有被標記的對象
不足主要有2個:
一個是效率問題,標記和清除兩個過程的效率都不高嘹承;
另一個是空間問題求摇,標記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會導致以后再程序運行過程中需要分配大對象時浸间,無法找到足夠的連續(xù)內(nèi)存而不得不提前出發(fā)另一次垃圾收集動作
2.復制算法
為了解決了 標記-清除算法 的效率問題,它將可用內(nèi)存按容量劃分為大小相等的兩塊吟榴,每次只使用其中一塊魁蒜。當這塊內(nèi)存用完了,就將還存活著的對象復制到另外一塊上面吩翻,然后再把已使用過的內(nèi)存空間一次清理掉兜看。
過程:將內(nèi)存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊Survivor狭瞎。當回收時细移,將Eden和Survivor中還存活著對象一次性地復制到另一塊Survivor空間上,最后清理掉Eden和剛才用戶的Survivor空間熊锭。HotSpot虛擬機默認Eden和Survivor的大小比例是8 : 1弧轧,當Survivor空間不夠用時,需要依賴其他內(nèi)存(這里只老年代)進行分配擔保(Handle Promotion)碗殷,如果另外一塊Survivor空間沒有足夠空間存放上一次新生代手機下來的存活對象時劣针,這些對象將直接通過分配擔保機制進入老年代。
缺點:在對象存活率較高時就要進行較多的復制操作亿扁,效率將會變低捺典,需要有額外的空間分配擔保
該算法一般用于回收 新生代,老年代一般不直接選用該算法
3.標記-整理算法
標記過程仍然與"標記-清除"算法一樣从祝,但后續(xù)步驟不是直接對可回收對象進行清理襟己,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存牍陌。
4.分代收集算法
根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊擎浴。一般把java堆分為新生代和老年代,這樣可以根據(jù)各個年代的特點采用最適當?shù)氖占惴ǘ窘В律锌梢赃x用復制算法贮预,老年代需要使用 標記-清理 或 標記-整理 算法來進行回收。