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