垃圾收集器在對(duì)堆進(jìn)行回收前,需要先判斷堆中哪些對(duì)象是“活著”的,哪些對(duì)象是“死了”的。
1.引用計(jì)數(shù)法
給對(duì)象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)地方引用它時(shí),計(jì)數(shù)器加1,當(dāng)引用失效時(shí),計(jì)數(shù)器減1。任何時(shí)刻計(jì)數(shù)器為0的對(duì)象就是不可能再被使用的。
引用計(jì)數(shù)器實(shí)現(xiàn)簡單,效率高。但是主流的JVM并沒有使用引用計(jì)數(shù)法來管理內(nèi)存,主要原因是它難以解決對(duì)象之間循環(huán)引用的問題。例如,對(duì)象objA和對(duì)象objB都有字段instance,令objA.instance=objB,objB.instance=objA,除此之外這兩個(gè)對(duì)象再無任何引用,實(shí)際上這兩個(gè)對(duì)象再無可能被訪問,但是因?yàn)閮蓚€(gè)對(duì)象之間互相引用,兩者的引用計(jì)數(shù)器都不為0,引用計(jì)數(shù)法無法回收這兩個(gè)對(duì)象。
2.可達(dá)性分析算法
JVM的主流實(shí)現(xiàn)是通過可達(dá)性分析來判斷對(duì)象是否存活的。這個(gè)算法的基本思路是通過一系列的稱為“GC Roots”的對(duì)象作為起點(diǎn),從這些起點(diǎn)開始向下搜索,搜索所走過的路徑稱為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒有任何引用鏈時(shí),證明此對(duì)象是不可用的,將會(huì)成為可回收的對(duì)象。
java中,可作為GC Roots的對(duì)象包括:
3.引用
引用可以分為強(qiáng)引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)和虛引用(Phantom Reference)四種。
// PRime holds a strong referenceCounter counter = new Counter();// soft reference variable has SoftReference to Counter Object primeSoftReference soft = new SoftReference(counter) ; // now Counter object is eligible for garbage collection // but only be collected when JVM absolutely needs memoryprime = null;
Counter counter = new Counter(); // weak referenceWeakReference weak = new WeakReference(counter);// now Counter object is eligible for garbage collectioncounter = null;
4.生存還是死亡
一個(gè)對(duì)象真正死亡,至少要經(jīng)歷兩次標(biāo)記過程。如果對(duì)象在可達(dá)性分析后發(fā)現(xiàn)沒有與GC Roots相連接的引用鏈,那它將會(huì)被第一次標(biāo)記并且進(jìn)行一次篩選,篩選條件是該對(duì)象是否有必要執(zhí)行finalize()方法。當(dāng)對(duì)象沒有覆蓋finalize()方法或者finalize()方法已經(jīng)被虛擬機(jī)執(zhí)行過,則認(rèn)為沒有必要執(zhí)行。如果對(duì)象有必要執(zhí)行finalize()方法,那么該對(duì)象會(huì)被放置到一個(gè)叫F-Queue的隊(duì)列中,并稍后由一個(gè)JVM自動(dòng)建立的、低優(yōu)先級(jí)的Finalizer線程去執(zhí)行。這里的“執(zhí)行”指虛擬機(jī)有機(jī)會(huì)促發(fā)這個(gè)方法,但不承諾會(huì)等待其運(yùn)行結(jié)束。finalize()方法是對(duì)象逃脫死亡的最后一次機(jī)會(huì),稍后GC將對(duì)F-Queue中的對(duì)象進(jìn)行第二次標(biāo)記,如果對(duì)象在finalize()中將自己重新與引用鏈上的任意對(duì)象建立關(guān)聯(lián)(例如將自己this賦值給某個(gè)類變量或?qū)ο蟮某蓡T變量),那么第二次標(biāo)記是將其移出需要回收的集合,否則該對(duì)象就真的會(huì)被回收了。
5.回收方法區(qū)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注