垃圾回收-引用计数法循环引用问题

  实现思路:给对象添加一个引用计数器。每当有一个地方引用它时,计数器加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,导致不能进行垃圾回收。

引用计数法的循环引用问题

猜你喜欢

转载自www.cnblogs.com/gogogofh/p/11113744.html
今日推荐