垃圾收集器的基本原理
垃圾收集器通過追蹤對象的引用情況,識(shí)別出那些不再被引用的對象,并回收它們所占用的內(nèi)存。這一過程通常包括三個(gè)階段:
-
標(biāo)記(Marking):標(biāo)記出所有存活的對象。
-
清除(Sweeping):清除未被標(biāo)記的對象,釋放它們的內(nèi)存。
-
壓縮(Compacting,可選):將存活的對象壓縮到內(nèi)存的一端,以便騰出連續(xù)的內(nèi)存空間,減少內(nèi)存碎片。
二、常見的垃圾收集算法
-
標(biāo)記-清除算法(Mark-Sweep):
-
原理:標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收掉所有被標(biāo)記的對象。
-
缺點(diǎn):效率問題(標(biāo)記和清除過程的效率都不高)和空間問題(標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片)。
-
復(fù)制算法(Copying):
-
原理:將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)這一塊的內(nèi)存用完了,就將還存活著的對象復(fù)制到另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。
-
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,運(yùn)行高效,且沒有內(nèi)存碎片。
-
缺點(diǎn):將內(nèi)存縮小為原來的一半,持續(xù)復(fù)制長生存期的對象則導(dǎo)致效率降低。
-
標(biāo)記-整理算法(Mark-Compact):
-
原理:標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象進(jìn)行清理,而是讓所有存活的對象都向一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存。
-
優(yōu)點(diǎn):避免了內(nèi)存碎片的產(chǎn)生。
-
分代收集算法(Generational Collection):
-
原理:根據(jù)對象存活周期的不同將內(nèi)存劃分為幾塊,如新生代和老年代。這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴ā?
-
應(yīng)用:在新生代中,每次垃圾收集時(shí)都發(fā)現(xiàn)有大批對象死去,只有少量存活,那就選用復(fù)制算法;而老年代中因?yàn)閷ο蟠婊盥矢摺]有額外空間對它進(jìn)行分配擔(dān)保,就必須使用“標(biāo)記-清理”或“標(biāo)記-整理”算法來進(jìn)行回收。
|