在对象中添加引用计数器,每当有地方引用此对象时,计数器+1;当引用失效是-1;当计数器为0是对象就不可能再被引用。
优点:引用计数算法实现简单,判断效率高。注:在java虚拟机里面没有选用引用计数算法来管理内存的,主要是因为它无法解决对象之间的相互循环引用问题。
例如:Objectobj=null;
publicvoidt(){
Testt1=newTest();
Testt2=newTest();
t1.obj=t2;
t2.obj=t1;
}
2、可达性分析算法
基本思路为通过称为“GCRoots”的对象作为起始点,从这些起始点向下搜索,搜索所走过的路径(引用链),当一个对象到GCRoots没有任何引用链相连时,则证明此对象是不可用的。如图:
Java中,可作为GCRoots的对象包括:
①虚拟机栈中引用对象。
②方法区中静态属性引用的对象
③方法区中常量引用的对象
④本地方法栈中JNI引用的对象。
3、对象引用
①强引用:如:Objectobj=newObject();只要强引用还在,垃圾收集器永远不会回收掉被引用的对象。
②软引用:是用来描述一些还有用但并非必须的对象。软引用关联的对象在系统将要发生内存溢出之前,将会把这些对象列进回收范围进行二次回收。如果回收后还没有足够的内存,才会抛出内存溢出异常。
③弱引用:用来描述非必需的对象,它的强度比软引用弱些,被弱引用关联的对象只能存活到下次垃圾收集之前。
④虚引用:也被称为幽灵引用或幻影引用,它是最弱的引用关系。一个对象是否有虚引用存在,完全不会对其生成时间构成影响,也无法通过虚拟引用来获取一个对象实例。