实现思路:给对象添加一个引用计数器。每当有一个地方引用它时,计数器加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