美文网首页
JAVA 四种引用:强引用、软引用、弱引用、虚引用

JAVA 四种引用:强引用、软引用、弱引用、虚引用

作者: 赵勇Yaphet | 来源:发表于2017-10-17 20:26 被阅读49次

    今天莫名其妙聊到这个东西。。。

    import java.lang.ref.PhantomReference;
    import java.lang.ref.ReferenceQueue;
    import java.lang.ref.SoftReference;
    import java.lang.ref.WeakReference;
    
    /**
     * Created by zhaoyong
     * 2017 10 17
     * 四种引用类型
     */
    
    @SuppressWarnings("NonAsciiCharacters")
    public class 四种引用类型 {
    
        /**
         * 强引用
         * 如果一个对象具有强引用,那垃圾回收器绝不会回收它。
         * 当内存空间不足,Java虚拟机抛出OOM
         * 强引用:A a = new A()
         */
        void StrongReference() {
            Object obj = new Object();
            // obj对象对后面new Object是一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉
        }
    
        /**
         * 弱引用
         * 弱引用是在第二次垃圾回收时回收
         * 短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null
         * 弱引用用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾
         * 可以通过弱引用的isEnqueued方法返回对象是否被垃圾回收器标记
         */
        void WeakReference() {
            Object obj = new Object();
            WeakReference<Object> wf = new WeakReference<>(obj);
            obj = null;
            wf.get();// 有时候会返回null
            wf.isEnqueued();// 返回是否被垃圾回收器标记为即将回收的垃圾
        }
    
        /**
         * 软引用
         * 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它
         * 如果内存空间不足了,就会回收这些对象的内存
         * 只要垃圾回收器没有回收它,该对象就可以被程序使用
         * 软引用可用来实现内存敏感的高速缓存
         * 软引用可以和一个引用队列(ReferenceQueue)联合使用
         * 如果软引用所引用的对象被垃圾回收器回收
         * Java虚拟机就会把这个软引用加入到与之关联的引用队列中
         */
        void SoftReference() {
            // 非必须引用,内存溢出之前进行回收,可以通过以下代码实现
            Object obj = new Object();
            SoftReference<Object> sf = new SoftReference<>(obj);
            obj = null;
            sf.get();// 有时候会返回null
            // 这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;
            // 软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。
        }
    
        /**
         * 虚引用
         * 顾名思义,就是形同虚设
         * 与其他几种引用都不同,虚引用并不会决定对象的生命周期
         * 如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收
         * 虚引用主要用来跟踪对象被垃圾回收器回收的活动
         * 虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用
         * 当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中
         */
        void PhantomReference() {
            //垃圾回收时回收,无法通过引用取到对象值,可以通过如下代码实现
            Object obj = new Object();
            ReferenceQueue queue = new ReferenceQueue();
    
            PhantomReference<Object> pf = new PhantomReference<Object>(obj, queue);
            obj = null;
            pf.get();// 永远返回null
            pf.isEnqueued();// 返回是否从内存中已经删除
            // 虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null
            // 因此也被成为幽灵引用。
            // 虚引用主要用于检测对象是否已经从内存中删除。
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:JAVA 四种引用:强引用、软引用、弱引用、虚引用

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