1. 程式人生 > >java垃圾回收演算法之-引用計數器

java垃圾回收演算法之-引用計數器

引用計數器演算法算是一種古老的java垃圾回收演算法,目前很多版本的java已經廢棄掉這種演算法了。不過多瞭解歷史解決方案也是很有好處的,通過總結它的優缺點,再與新演算法比較,可以幫助更好的理解新演算法。

引用計數器演算法描述

定義:給每個物件分配一個計算器,當有引用指向這個物件時,計數器加1,當指向該物件的引用失效時,計數器減一。最後如果該物件的計算器為0時,java垃圾回收器會認為該物件是可回收的。

優點

實時性
無需等到記憶體不夠的時候,才開始回收,執行時根據物件的計數器是否為0,就可以直接回收。

應用無需掛起
在垃圾回收過程中,應用無需掛起。如果申請記憶體時,記憶體不足,則立刻報outofmember 錯誤。

區域性
更新物件的計數器時,只是影響到該物件,不會掃描全部物件

缺點

1、每次物件被引用時,都需要去更新計數器,有一點時間開銷。另外無法解決迴圈引用問題。例如:

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永遠都不會被回收。

2、浪費cpu,即使記憶體夠用,仍然在執行時進行計數器的統計