版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請注明出處,歡迎交流學(xué)習(xí)!
在堆內(nèi)存中存放著Java程序中幾乎所有的對象實例,堆內(nèi)存的容量是有限的,Java虛擬機會對堆內(nèi)存進(jìn)行管理,回收已經(jīng)“死去”的對象(即不可能再被任何途徑使用的對象),釋放內(nèi)存。垃圾收集器在對堆內(nèi)存進(jìn)行回收前,首先要做的第一件事就是確定這些對象中哪些還存活著,哪些已經(jīng)死去。Java虛擬機是如何判斷對象是否可以被回收的呢?
引用計數(shù)算法
引用計數(shù)算法的原理是這樣的:給對象添加一個引用計數(shù)器,每當(dāng)有一個地方引用它時,計數(shù)器值就加1;當(dāng)引用失效時,計數(shù)器值就減1;在任何時刻計數(shù)器的值為0的對象就是不可能再被使用的,也就是可被回收的對象。
引用計數(shù)算法的效率很高,但是主流的JVM并沒有選用這種算法來判定可回收對象,因為它有一個致命的缺陷,那就是它無法解決對象之間相互循環(huán)引用的的問題,對于循環(huán)引用的對象它無法進(jìn)行回收。
假設(shè)有這樣一段代碼:
<