1. 標(biāo)記-清除算法
首先標(biāo)記出所有需要回收的對象憔儿,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對象.
存在的問題:
- 效率問題: 標(biāo)記和清除兩個過程的效率都不高.
- 空間問題: 標(biāo)記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片.
2. 復(fù)制算法
為了解決效率問題
它將可用內(nèi)存按容量劃分為大小相等的兩塊婆硬,每次只使用其中的一塊。 當(dāng)這一塊的內(nèi)存用了天揖,就將還存活著的對象復(fù)制到另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉柑贞。
優(yōu)缺點
- 優(yōu)點: 實現(xiàn)簡單掖棉,運行高效. 每次都是對整個半?yún)^(qū)進行內(nèi)存回收,內(nèi)存分配時也就不用考慮內(nèi)存碎片等復(fù)雜情況蒂窒,只要移動堆頂指針躁倒,按順序分配內(nèi)存即可荞怒。
- 缺點: 代價是將內(nèi)存縮小為了原來的一半,未免太高了一點秧秉。
現(xiàn)在的商業(yè)虛擬機都采用這種收集算法來回收新生代,IBM公司的專門研究表明褐桌,新生代中的對象98%是“朝生夕死”的,所以并不需要按照1:1的比例來劃分內(nèi)存空間象迎,而是將內(nèi)存分為一塊較大的Eden空間和兩塊較小的Survivor空間荧嵌,每次使用Eden和其中一塊Survivor。當(dāng)回收時砾淌,將Eden和Survivor中還存活著的對象一次性地復(fù)制到另外一塊Survivor空間上啦撮,最后清理掉Eden和剛才用過的Survivor空間。 HotSpot虛擬機默認Eden和Survivor的大小比例是8:1汪厨,也就是每次新生代中可用內(nèi)存空間為整個新生代容量的90%(80%+10%)赃春,只有10%的內(nèi)存會被“浪費”。 當(dāng)然劫乱,98%的對象可回收只是一般場景下的數(shù)據(jù)聘鳞,我們沒有辦法保證每次回收都只有不多于10%的對象存活,當(dāng)Survivor空間不夠用時要拂,需要依賴其他內(nèi)存(這里指老年代)進行分配擔(dān)保(Handle Promotion)。
3. 標(biāo)記-整理算法
復(fù)制收集算法在對象存活率較高時就要進行較多的復(fù)制操作站楚,效率將會變低脱惰。更關(guān)鍵的是,如果不想浪費 50% 的空間窿春,就需要有額外的空間進行分配擔(dān)保拉一,以應(yīng)對被使用的內(nèi)存中所有對象都 100% 存活的極端情況,所以在老年代一般不能直接選用這種算法旧乞。
標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣蔚润,但后續(xù)步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動尺栖,然后直接清理掉端邊界以外的內(nèi)存
4. 分代收集算法
是一種組合算法: "復(fù)制算法"+"標(biāo)記-清除算法".
根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊(一般將堆分為新生代和老年代),根據(jù)各個年代的特點采用最適當(dāng)?shù)氖占惴?
- 新生代: 復(fù)制算法,這塊一般都有大量對象死去,只需要付出少量存活對象的復(fù)制成本,
- 老年代:標(biāo)記-清除算法,對象存活率高,沒有額外空間對它進行分擔(dān)擔(dān)保.