JVM垃圾回收引用计数法入门理解
引用计数法是历史最悠久的一种算法,
引用:假设一个对象A 中定义了一个B 对象中的属性这个称为A 引用B ;
原理: 对象B 引用对象A 那么对象A 的计数器就+1,同理被其他对象引用,计数器就+1 ,当对象B 引用失败了,那么对象A 的计数器就-1,当计数器值为0 时,gc就会将A 回收;
优点:实时性很高,不用等到内存不够用的时候才去垃圾回收,运行时根据对象的计数器是否为0来判断,当计数器为0 的时候就进行回收,在垃圾回收的整个过程中,应用不需要挂起,如果去申请内存不够就会报错outofmenber 内存溢出的错;并且在更新对象的计数器的时候 只会影响到该对象不会去扫描全部的对象;
缺点:每次对象引用的时都需要更新计数器有一定时间的开销;在内存够用的情况下 依然去判断计数器的值是否为0并更新,浪费cpu的资源;但是最致命的是:无法解决循环引用;
class TestA{
public TestB b;
}
class TestA{
public TestB b;
}
public class main{
public static void main(Strings[] args){
A a=new A();
Bb =new B();
a.b=b;
b.a=a;
a=null;
b=null;
}
}
这个时候a 和b 都为null ,对于gc来说 a和b都是为null可以被回收的,但是a 和b存在循环引用,这样的情况a和b用计数器的算法就永远不会被回收