1.概念
引用計數器算法算是一種古老的java垃圾回收算法,目前很多版本的java已經廢棄掉這種算法了。不過多瞭解歷史解決方案也是很有好處的,通過總結它的優缺點,再與新算法比較,可以幫助更好的理解新算法。
2.算法描述
定義:給每個對象分配一個計算器,當有引用指向這個對象時,計數器加1,當指向該對象的引用失效時,計數器減一。最後如果該對象的計算器爲0時,java垃圾回收器會認爲該對象是可回收的。
3.優點
實時性
無需等到內存不夠的時候,纔開始回收,運行時根據對象的計數器是否爲0,就可以直接回收。
應用無需掛起
在垃圾回收過程中,應用無需掛起。如果申請內存時,內存不足,則立刻報outofmember 錯誤。
區域性
更新對象的計數器時,只是影響到該對象,不會掃描全部對象
4.缺點
1.浪費cpu,即使內存夠用,仍然在運行時進行計數器的統計
2.每次對象被引用時,都需要去更新計數器,有一點時間開銷。另外無法解決循環引用問題。
例如:
class TestA{
public TestB b;
}
class TestB{
public TestA a;
}
public class Main{
public static void main(String[] args){
A a = new A();
B b = new B();
a.b=b;
b.a=a;
a = null;
b = null;
}
}
雖然a和b都爲null,但是由於a和b存在循環引用,這樣a和b永遠都不會被回收。