对象是否存在的判定方法

  • 混淆点 : 引用计数的算法难以解决对象之间的相互循环引用.所以, JAVA 和 C# 都是用根据搜索算法来判断对象是否存活的.
  • 算法思路 :  通过一系列的名为 "GCRoot" 的对象作为起始点,从这些节点开始向下搜索,搜索所有走过的路径称为引用链,当一个对象到 CCRoot 没有任何引用链相连时,说明该对象不可用.
  • 可以作为 GCRoot 对象有:
  1. 虚拟栈(栈桢中本地变量表)中引用的对象
  2. 方法区中的类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法中 JVI(native 方法)的引用对象
  • 应用的分类:
  1. 强引用
  2. 软引用 : softReference, 软引用被回收在内存溢出之前
  3. 弱引用 : weakReference, 弱引用被回收在下一次 GC 回收之前
  4. 虚引用 : phantomReference

    "虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
    虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    特别注意,在程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。

    以下是软引用的代码:

    复制代码
    import java.lang.ref.SoftReference;  
    public class Test {  
          
        public static void main(String[] args){  
            System.out.println("开始");           
            A a = new A();            
            SoftReference<A> sr = new SoftReference<A>(a);  
            a = null;  
            if(sr!=null){  
                a = sr.get();  
            }  
            else{  
                a = new A();  
                sr = new SoftReference<A>(a);  
            }          
            System.out.println("结束");     
        }        
    }  
      
    class A{  
        int[] a ;  
        public A(){  
            a = new int[100000000];  
        }  
    }

posted on 2017-08-14 10:36  北极猩球  阅读(286)  评论(0编辑  收藏  举报

导航