原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;在任什么时候刻计数器的值为0的对象就是不可能再被使用的,也就是可被回收的对象。web
它有一个致命的缺陷,那就是它没法解决对象之间相互循环引用的的问题,对于循环引用的对象它没法进行回收。算法
public class Object {
public Object instance;
public static void main(String[] args) {
// 1
Object objectA = new Object();
Object objectB = new Object();
// 2
objectA.instance = objectB;
objectB.instance = objectA;
// 3
objectA = null;
objectB = null;
}
}
程序启动后,objectA和objectB两个对象被建立并在堆中分配内存,这两个对象都相互持有对方的引用,除此以外,这两个对象再无任何其余引用,实际上这两个对象已经不可能再被访问(引用被置空,没法访问),可是它们由于相互引用着对方,致使它们的引用计数器都不为0,因而引用计数算法没法通知GC收集器回收它们。spa
实际上,当第1步执行时,两个对象的引用计数器值都为1;当第2步执行时,两个对象的引用计数器都为2;当第3步执行时,两者都清为空值,引用计数器值都变为1。根据引用计数算法的思想,值不为0的对象被认为是存活的,不会被回收;而事实上这两个对象已经不可能再被访问了,应该被回收。线程