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