美文网首页
强软弱虚引用

强软弱虚引用

作者: 小小卒_oO_ | 来源:发表于2019-04-01 17:16 被阅读0次

    一、强引用(StrongReference)

    不会回收有强引用的对象。

    String str ="hello";//普通声明就是强引用
    str = null;//赋值为null,JVM在合适的时间就会回收该对象
    

    除了强引用,其他的引用都需要借助java.lang.ref包下的抽象类 Reference 的子类来进行包装操作了!在java.lang.ref包下,Reference类有3个具体的实现类,SoftReferenceWeakReferencePhantomReference,分别表示软引用、弱引用和虚引用!

    二、软引用(SoftReference)

    如果内存空间足够,就不会回收它;如果内存空间不足,就会回收。

    String str=new String("abc");                                     // 强引用
    SoftReference<String> soft = new SoftReference<String>(str);     // 软引用
    //软引用包含的对象可以通过get()获取到
    soft.get();
    -------
    //提醒系统进行一个垃圾收集
    System.gc();
    System.out.println(soft.get() == null);//打印false,说明软引用中的对象并没有被回收!
    

    三、弱引用(WeakReference)

    不管当前内存空间足够与否,都会回收。

    // 创建一个引用队列
    ReferenceQueue<String> rq = new ReferenceQueue<String>();
    // 实现一个弱引用,将强引用类型hello和是实例化的rq放到弱引用实现里面
    WeakReference<String> weak = new WeakReference<String>(new String("hello"), rq);
    // 通过弱引用get方法获取强引用中创建的内存空间hello值
    System.out.println(weak.get());
    System.gc();                //通知JVM的gc进行垃圾回收
    System.out.println(weak.get() == null);//打印true,说明弱引用中的对象被回收了!
    -----------
    //创建一个弱引用,包含一个对象
    WeakReference<Integer> weak = new WeakReference<>(new Integer("23456"));
    //弱引用包含的对象可以通过get()获取到
    Integer weakNum = weak.get();
    

    四、虚引用(PhantomReference)

    和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

    //创建一个虚引用,包含一个对象
    ReferenceQueue<Integer> intRq = new ReferenceQueue<>();
    PhantomReference<Integer> phantom = new PhantomReference<>(new Integer("23456"),intRq);
    //引用包含的对象可以通过get()获取到
    Integer phantomNum = phantom.get();
    
    • 无法通过虚引用来获取对一个对象的真实引用。
    • 虚引用必须和引用队列 (ReferenceQueue)联合使用。
    • 唯一的用处:能在对象被GC时收到系统通知。
    • 如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

    相关文章

      网友评论

          本文标题:强软弱虚引用

          本文链接:https://www.haomeiwen.com/subject/aoivbqtx.html