版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請注明出處,歡迎交流學(xué)習(xí)!

       在堆內(nèi)存中存放著Java程序中幾乎所有的對象實(shí)例,堆內(nèi)存的容量是有限的,Java虛擬機(jī)會對堆內(nèi)存進(jìn)行管理,回收已經(jīng)“死去”的對象(即不可能再被任何途徑使用的對象),釋放內(nèi)存。垃圾收集器在對堆內(nèi)存進(jìn)行回收前,首先要做的第一件事就是確定這些對象中哪些還存活著,哪些已經(jīng)死去。Java虛擬機(jī)是如何判斷對象是否可以被回收的呢?

       引用計數(shù)算法

       引用計數(shù)算法的原理是這樣的:給對象添加一個引用計數(shù)器,每當(dāng)有一個地方引用它時,計數(shù)器值就加1;當(dāng)引用失效時,計數(shù)器值就減1;在任何時刻計數(shù)器的值為0的對象就是不可能再被使用的,也就是可被回收的對象。

       引用計數(shù)算法的效率很高,但是主流的JVM并沒有選用這種算法來判定可回收對象,因?yàn)樗幸粋€致命的缺陷,那就是它無法解決對象之間相互循環(huán)引用的的問題,對于循環(huán)引用的對象它無法進(jìn)行回收。

       假設(shè)有這樣一段代碼:

       

<