引用計數法的循環引用問題

關於引用計數法,我們可以先看一段wiki上的描述:


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.

       作爲一種回收算法,引用計數法記錄着每一個對象被其它對象所持有的引用數。如果一個對象的引用計數爲零,那麼該對象就變成了所謂的不可達對象,亦即可以被回收的。

       當一個對象被回收後,被該對象所引用的其它對象的引用計數都應該相應減少。

       而所謂的循環引用(circular referrence)有是什麼意思呢?舉個簡單的例子:

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將不能被回收,因爲他們的引用計數無法爲零。wKioL1MyZ-SDBSeHAAFo1QsAt2U761.jpg

       但是具體是爲什麼呢?已上圖爲例,當代碼執行完line7時,兩個對象的引用計數均爲2。此時將myObject1和myObject2分別置爲null,以前一個對象爲例,它的引用計數將減1。若要滿足垃圾回收的條件,需要清除myObject2中的ref這個引用,而要清除掉這個引用的前提條件是myObject2引用的對象被回收,可是該對象的引用計數也爲1,因爲myObject1.ref指向了它。以此類推,也就進入一種死循環的狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章