引用計數經常使用來講明垃圾收集的工做方式,但彷佛從未被應用與任何一種Java虛擬機中實現。《java編程思想》
關於引用計數法,咱們能夠先看一段wiki上的描述:java
As a collection algorithm, reference counting tracks, for each object, a count of the number of references to it held by other objects. If an object's reference count reaches zero, the object has become inaccessible, and can be destroyed.算法
When an object is destroyed, any objects referenced by that object also have their reference counts decreased.編程
做爲一種回收算法,引用計數法記錄着每個對象被其它對象所持有的引用數。若是一個對象的引用計數爲零,那麼該對象就變成了所謂的不可達對象,亦便可以被回收的。code
當一個對象被回收後,被該對象所引用的其它對象的引用計數都應該相應減小。對象
而所謂的循環引用(circular referrence)有是什麼意思呢?舉個簡單的例子:blog
public class MyObject { public Object ref = null; public static void main(String[] args) { MyObject myObject1 = new MyObject(); MyObject myObject2 = new MyObject(); myObject1.ref = myObject2; myObject2.ref = myObject1; myObject1 = null; myObject2 = null; } }
從上面的代碼能夠輕易地發現myObject1與myObject2互爲引用,咱們知道若是採用引用計數法,myObject1和myObject2將不能被回收,由於他們的引用計數沒法爲零。ci
可是具體是爲何呢?已上圖爲例,當代碼執行完line7時,兩個對象的引用計數均爲2。此時將myObject1和myObject2分別置爲null,之前一個對象爲例,它的引用計數將減1。若要知足垃圾回收的條件,須要清除myObject2中的ref這個引用,而要清除掉這個引用的前提條件是myObject2引用的對象被回收,但是該對象的引用計數也爲1,由於myObject1.ref指向了它。以此類推,也就進入一種死循環的狀態。get