原理:給對象添加一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;在任什麼時候刻計數器的值爲0的對象就是不可能再被使用的,也就是可被回收的對象。web
它有一個致命的缺陷,那就是它沒法解決對象之間相互循環引用的的問題,對於循環引用的對象它沒法進行回收。算法
public class Object {
public Object instance;
public static void main(String[] args) {
// 1
Object objectA = new Object();
Object objectB = new Object();
// 2
objectA.instance = objectB;
objectB.instance = objectA;
// 3
objectA = null;
objectB = null;
}
}
程序啓動後,objectA和objectB兩個對象被建立並在堆中分配內存,這兩個對象都相互持有對方的引用,除此以外,這兩個對象再無任何其餘引用,實際上這兩個對象已經不可能再被訪問(引用被置空,沒法訪問),可是它們由於相互引用着對方,致使它們的引用計數器都不爲0,因而引用計數算法沒法通知GC收集器回收它們。spa
實際上,當第1步執行時,兩個對象的引用計數器值都爲1;當第2步執行時,兩個對象的引用計數器都爲2;當第3步執行時,兩者都清爲空值,引用計數器值都變爲1。根據引用計數算法的思想,值不爲0的對象被認爲是存活的,不會被回收;而事實上這兩個對象已經不可能再被訪問了,應該被回收。線程