美文网首页
Java引用类型之 :强引用

Java引用类型之 :强引用

作者: 贪睡的企鹅 | 来源:发表于2019-07-15 11:04 被阅读0次

    1 简述

    强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器宁愿抛出OOM(OutOfMemoryError)也不会回收它。

    2 使用

    2.1 创建强引用

    我们可以通过两种方式创建一个对象的强引用.

    最普遍的方式

    //最普遍的方式
    //创建一个强引用变量s,将对象地址设置给变量s这个引用
    String s = new String("Hello Frank!");
    

    使用FinalReference的方式

    //创建一个Reference对象finalRef,将对象地址设置给finalRef.reference引用
    FinalReference<Object> finalRef = new FinalReference<>(new Object());
    
    

    这里new FinalReference()本身也是堆中对象。指向对象地址的是其内部属性变量reference,在这里我把他称为引用,由于是FinalReference创建所以我们把它称为强引用

    image

    referenceQueue队列

    //创建一个Reference对象finalRef2,将对象地址设置给finalRef2.reference引用
    //同时给finalRef2设置referenceQueue
    ReferenceQueue<T> referenceQueue = new ReferenceQueue<>();
    FinalReference<Object> finalRef2 = new FinalReference<>(new Object(),referenceQueue);
    

    在创建一个FinalReference,我们可以为其设置一个referenceQueue队列,当引用对象new Object()将被回收时,会将reference对象放置进referenceQueue队列中。通过监控这个队列,取出reference对象,就可以对reference对象(存在堆中被finalRef2强引用)进行清理工作。

    2.2 释放强引用
    s=null;
    finalRef.clear();
    

    3 FinalReference源码

    FinalReference源码可以说非常少,其功能基本继承至父类Reference,关于Reference源码会放到一个专题来讲。这里我们只需要关注创建FinalReference有两种方式一种是一个需要传入ReferenceQueue,另一个则不需要(从父类继承)。

    class FinalReference<T> extends Reference<T> {
    
        public FinalReference(T referent, ReferenceQueue<? super T> q) {
            super(referent, q);
        }
    }
    
    public abstract class Reference<T> {
        ...省略代码
        /**
         * 实例化Reference
         */
        Reference(T referent) {
            this(referent, null);
        }
    
        /**
         * 实例化Reference
         */
        Reference(T referent, ReferenceQueue<? super T> queue) {
            this.referent = referent;
            this.queue = (queue == null) ? ReferenceQueue.NULL : queue;
        }
        ...省略代码
    

    5 强引用内存泄漏

    案例一

    image

    案例二

    image

    相关文章

      网友评论

          本文标题:Java引用类型之 :强引用

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