java垃圾回收演算法之-引用計數器
阿新 • • 發佈:2019-02-17
引用計數器演算法算是一種古老的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,即使記憶體夠用,仍然在執行時進行計數器的統計