JVM中的垃圾回收器算法主要有以下幾種:

分代收集理論
當(dāng)前虛擬機的垃圾收集都采用分代收集算法,這種算法沒有什么新的思想,只是根據(jù)對象存活周期的不同將內(nèi)存分為幾塊。一般將java堆分為新生代和老年代,這樣我們就可以根據(jù)各個年代的特點選擇合適的垃圾收集算法。比如在新生代中,每次收集都會有大量對象(近99%)死去,所以可以選擇復(fù)制算法,只需要付出少量對象的復(fù)制成本就可以完成每次垃圾收集。而老年代的對象存活幾率是比較高的,而且沒有額外的空間對它進(jìn)行分配擔(dān)保,所以我們必須選擇“標(biāo)記-清除”或“標(biāo)記-整理”算法進(jìn)行垃圾收集。注意,“標(biāo)記-清除”或“標(biāo)記-整理”算法會比復(fù)制算法慢10倍以上。
復(fù)制算法(Copying):
復(fù)制算法將堆空間分為兩個區(qū)域,每次只使用其中一個區(qū)域,當(dāng)一個區(qū)域用完后,將其中的存活對象復(fù)制到另一個區(qū)域中,然后清空當(dāng)前區(qū)域。這種算法的優(yōu)點是不會產(chǎn)生內(nèi)存碎片,但是需要浪費一半的空間。

標(biāo)記-清除算法(Mark-Sweep):
算法分為“標(biāo)記”和“清除”階段:標(biāo)記存活的對象,統(tǒng)一回收所有未被標(biāo)記的對象(一般選擇這種);也可以反過來,標(biāo)記出所有需要回收的對象,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對象。它是最基礎(chǔ)的收集算法,比較簡單,但是會帶來兩個明顯的問題:
1.效率問題(如果需要標(biāo)記的對象太多,效率不高)
2.空間問題(標(biāo)記清除后會產(chǎn)生大量不連續(xù)的碎片)

標(biāo)記-整理算法(Mark-Compact):
根據(jù)老年代的特點特出的一種標(biāo)記算法,標(biāo)記過程仍然與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對可回收對象回收,而是讓所有存活的對象向一端移動,然后直接清理掉端邊界以外的內(nèi)存。

分代算法(Generational):
分代算法是將堆空間分為年輕代和老年代兩部分。年輕代中的對象生命周期較短,老年代中的對象生命周期較長。使用不同的垃圾回收算法來處理不同區(qū)域的對象。年輕代中通常采用復(fù)制算法,而老年代中通常采用標(biāo)記-清除或標(biāo)記-整理算法。
清除-增量算法(Sweeping):
清除-增量算法是一種優(yōu)化算法,它將垃圾回收過程分成多個階段,每個階段都可以讓應(yīng)用程序執(zhí)行一段時間。這樣可以讓垃圾回收過程與應(yīng)用程序執(zhí)行交替進(jìn)行,減少垃圾回收對應(yīng)用程序的影響。