天天看點

垃圾回收-引用計數法循環引用問題引用計數法的循環引用問題

  實作思路:給對象添加一個引用計數器。每當有一個地方引用它時,計數器加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