美文网首页
强引用,软引用,弱引用,虚引用

强引用,软引用,弱引用,虚引用

作者: Children乏 | 来源:发表于2020-02-05 16:24 被阅读0次

    强引用

    是使用最普遍的引用:

    Object o = new Object() ;
    

    特点:不会被GC

    public static void strongReference() {
        Object o = new Object();
        System.out.println(o);
    
        System.gc();
        System.out.println(o);
        if (o == null) {
            System.out.println("强引用对象o 已被gc");
        } else {
            System.out.println("强引用对象o 仍存在");
        }
    }
    

    执行结果:

    java.lang.Object@1540e19d
    java.lang.Object@1540e19d
    强引用对象o 仍存在
    

    弱引用 WeakReference

    Object o = new Object();
    System.out.println(o);
    
    WeakReference<Object> wr = new WeakReference<>(o);
    // 记得去除强引用,才能转化为真正的弱引用
    o = null;
    System.out.println(wr.get());
    

    特点:只要gc启动,不管当前内存空间足够与否,都会回收它的内存

    public static void weakReference() {
        Object o = new Object();
        System.out.println(o);
    
        WeakReference<Object> wr = new WeakReference<>(o);
        // 记得去除强引用,才能转化为真正的弱引用
        o = null;
        System.out.println(wr.get());
    
        System.gc();
        System.out.println(wr.get());
        if (wr.get() == null) {
            System.out.println("弱引用对象 已被gc");
        } else {
            System.out.println("弱引用对象 仍存在");
        }
    }
    

    执行结果:

    java.lang.Object@677327b6
    java.lang.Object@677327b6
    null
    弱引用对象 已被gc
    

    软引用 SoftReference

    public static void softReference() {
        Object o = new Object();
        System.out.println(o);
    
        SoftReference<Object> sr = new SoftReference<>(o);
        // 记得去除强引用,才能转化为真正的软引用
        o = null;
        System.out.println(sr.get());
    
        System.gc();
        if (sr.get() == null) {
            System.out.println("软引用对象o 已被gc");
        } else {
            System.out.println("软引用对象o 仍存在");
            System.out.println(sr.get());
        }
    }
    

    执行结果

    java.lang.Object@14ae5a5
    java.lang.Object@14ae5a5
    软引用对象o 仍存在
    java.lang.Object@14ae5a5
    

    特点:

    • 介于强引用和弱引用之间;
    • 内存空间不足时,gc才会回收这些对象的内存;
    • 软引用可用来实现内存敏感的高速缓存。

    虚引用 PhantomReference

    public static class M {
        @Override
        protected void finalize() throws Throwable {
            System.out.println("gc M");
        }
    }
    
    public static void phantomReference() {
        M m = new M();
        System.out.println(m);
    
        PhantomReference<M> pr = new PhantomReference<>(m, null);
        // 记得去除强引用,才能转化为真正的虚引用
        m = null;
    
        if (pr.get() == null) {
            System.out.println("虚引用不可获取对象");
        } else {
            System.out.println("虚引用可获取对象");
            System.out.println(pr.get());
        }
    
        System.gc();
    }
    

    执行结果

    com.peterq.Reference$M@7f31245a
    虚引用不可获取对象
    gc M
    

    特点:

    • 形同虚设,也称为幻影引用;
    • 无法通过虚引用来获取对一个对象的真实引用;
    • 唯一的用处:能在对象被GC时收到系统通知

    相关文章

      网友评论

          本文标题:强引用,软引用,弱引用,虚引用

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