實作思路:給對象添加一個引用計數器。每當有一個地方引用它時,計數器加1;引用失效時計數器減1。在任何時刻計數器為0的對象就是不可能再被使用的。
優點:實作簡單,效率高。
缺點:很難解決對象之間的互相循環引用。A引用B,B引用A ——循環引用 (引用計數算法)由于A、B彼此引用對方,導緻引用計數都不為0,是以GC無法回收它們
1 public class MyObject {
2 public Object ref = null;
3 public static void main(String[] args) {
4 MyObject myObject1 = new MyObject();
5 MyObject myObject2 = new MyObject();
6 myObject1 = myObject2;
7 myObject2 = myObject1;
8 myObject1 = null;
9 myObject2 = null;
10 }
11 }
以myObject1對象為例:
1、代碼執行到line6,myObject1的引用計數為2。
2、myObject1 = null,myObject1的引用計數為1。
3、myObject1=0,垃圾回收器才能進行垃圾回收,myObject1 = myObject2;因為myObject1持有myObject2的引用,而要清除掉這個引用的前提條件是myObject2引用的對象被回收。而myObject2 = myObject1,最終死循環。
4、myObject1 和myObject2均為1,導緻不能進行垃圾回收。
引用計數法的循環引用問題
轉載于:https://www.cnblogs.com/gogogofh/p/11113744.html