java中的四种引用(强,弱,软,虚)

  • 强引用
  • 软引用(SoftReference)
  • 弱引用(WeakReference)
  • 虚引用(PhantomReference)

强引用

当内存不足时,jvm宁可抛出OutOfMemory错误,也不会回收内存

    /**
     * 强引用
     */
    public void fun1() {
//        Object object = new Object();
//        Object[] objArr = new Object[1000];
        Object object = new Object();//强引用
        Object ref = object;//引用传递
        System.out.println(object);
        boolean equals = object.equals(new Object()); //可直接通过obj取得对应的对象
        System.out.println(equals);
        object = null;//断开引用与对象的链接
        System.gc();
        System.out.println(object);
        System.out.println(ref);
    }

软引用

GC的时候,一旦发现软引用的对象,如果此时jvm内存足够,则不会回收该对象,反之,回收。

    /**
     * 软引用
     */
    public void fun2(){
        Object object = new Object();
        SoftReference reference = new SoftReference(object);
        object = null;
        System.out.println(reference.get());
        System.gc();//对比弱引用
        System.out.println(reference.get());//非Null

    }

弱引用

GC的时候,一旦发现弱引用,无论当前内存是否足够,都会回收该对象。

    /**
     * 弱引用
     */
    public void  fun3(){
        Object object = new Object();
        WeakReference reference = new WeakReference(object);
        object = null;
        System.out.println(reference.get());//结果:java.lang.Object@610455d6
        System.gc();
        System.out.println(reference.get());//结果:null
    }

虚引用

虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

   /**
     * 虚引用
     */
    public void fun4(){
        ReferenceQueue queue = new ReferenceQueue<>();

        String string = new String("hello");

        PhantomReference reference = new PhantomReference(string,queue);

        System.out.println(reference.get());//结果 null

    }

引用强度排序

强应用>软引用>弱引用>虚引用

你可能感兴趣的:(java中的四种引用(强,弱,软,虚))