跟蹤收集器
跟蹤收集器采用的為集中式的管理方式,全局記錄對(duì)象之間的引用狀態(tài),執(zhí)行時(shí)從一些列GC Roots的對(duì)象做為起點(diǎn),從這些節(jié)點(diǎn)向下開始進(jìn)行搜索所有的引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots 沒有任何引用鏈時(shí),則證明此對(duì)象是不可用的。
下圖中,對(duì)象Object6、Object7、Object8雖然互相引用,但他們的GC Roots是不可到達(dá)的,所以它們將會(huì)被判定為是可回收的對(duì)象。

可作為GC Roots 的對(duì)象包括:
虛擬機(jī)棧(棧幀中的本地變量表)中的引用對(duì)象。
方法區(qū)中的類靜態(tài)屬性引用的對(duì)象
方法區(qū)中的常量引用的對(duì)象
本地方法棧中JNI的引用對(duì)象。
主要有復(fù)制、標(biāo)記清除、標(biāo)記壓縮三種實(shí)現(xiàn)算法。
1. 標(biāo)記 – 清除算法
標(biāo)記清除算法是最基礎(chǔ)的收集算法,其他收集算法都是基于這種思想。標(biāo)記清除算法分為“標(biāo)記”和“清除”兩個(gè)階段:首先標(biāo)記出需要回收的對(duì)象,標(biāo)記完成之后統(tǒng)一清除對(duì)象。
它的主要缺點(diǎn):
?、?標(biāo)記和清除過程效率不高
?、?標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片。


2. 復(fù)制算法
它將可用內(nèi)存容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)這一塊用完之后,就將還存活的對(duì)象復(fù)制到另外一塊上面,然后在把已使用過的內(nèi)存空間一次清理掉。這樣使得每次都是對(duì)其中的一塊進(jìn)行內(nèi)存回收,不會(huì)產(chǎn)生碎片等情況,只要移動(dòng)堆訂的指針,按順序分配內(nèi)存即可,實(shí)現(xiàn)簡單,運(yùn)行高效。
主要缺點(diǎn):
內(nèi)存縮小為原來的一半。


3. 標(biāo)記 - 整理算法
標(biāo)記操作和“標(biāo)記-清除”算法一致,后續(xù)操作不只是直接清理對(duì)象,而是在清理無用對(duì)象完成后讓所有存活的對(duì)象都向一端移動(dòng),并更新引用其對(duì)象的指針。
主要缺點(diǎn):
在標(biāo)記-清除的基礎(chǔ)上還需進(jìn)行對(duì)象的移動(dòng),成本相對(duì)較高,好處則是不會(huì)產(chǎn)生內(nèi)存碎片。


引用計(jì)數(shù)收集器
引用計(jì)數(shù)收集器采用的是分散式管理方式,通過計(jì)數(shù)器記錄對(duì)象是否被引用。當(dāng)計(jì)數(shù)器為0時(shí)說明此對(duì)象不在被使用,可以被回收。
主要缺點(diǎn):
循環(huán)引用的場景下無法實(shí)現(xiàn)回收,例如下面的圖中,ObjectC和ObjectB相互引用,那么ObjectA即便釋放了對(duì)ObjectC、ObjectB的引用,也無法回收。sunJDK在實(shí)現(xiàn)GC時(shí)未采用這種方式。
