Java引用类型之 :强引用

2019-07-15  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读