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创建所以我们把它称为强引用
imagereferenceQueue队列
//创建一个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
网友评论