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<Object> reference = new SoftReference<Object>(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<Object> reference = new WeakReference<Object>(object);
        object = null;
        System.out.println(reference.get());//结果:java.lang.Object@610455d6
        System.gc();
        System.out.println(reference.get());//结果:null
    }

虚引用

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

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

        String string = new String("hello");

        PhantomReference<String> reference = new PhantomReference<String>(string,queue);

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

    }

引用强度排序

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容