WeakReference使用教程
的有关信息介绍如下:WeakReference是弱引用,弱引用持有的对象实例是可以被垃圾回收器回收的。通常用于保存保存对象的引用,却又不会影响对象被GC回收。对于DEBUG和内存监视工具非常有用。一般也常与队列联合使用。下面简单的介绍下如何使用WeakReference
使用说明还是从测试例子开始说明,首先添加一个TestWeakReference测试例子
/**
* 测试弱引用
* Created by shaowei on 2017/8/14.
*/
public class TestWeakReferece {
public static void main(String[] args) {
Object o = new Object();
WeakReference
o = null;
int i = 0;
while (weak.get() != null) {
i++;
System.out.println("Object is not null. count is " + i);
if (i % 10 == 0) {
System.gc();
System.out.println("System.gc() was called!");
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
System.out.println("object o was cleared by JVM!");
}
}
运行测试代码,打印结果如下,从结果中可以看出,循环打印了10次weak.get()都不为空,在第十次调用了System.gc(),之后weak.get()显示为空,则说明被gc回收了
从示例代码中可以看出,WeakReference对象一直持有o对象,就是因为WeakReference类是弱引用持有o对象,才没有影响到垃圾回收器对o对象的回收。
我们后续使用WeakReference时,就如图本例测试代码一样去构造WeakReference对象然后持有我们需要弱引用控制的类
WeakReference使用方法非常简单,主要是对WeakReference这个类的理解以及对java内存垃圾回收机制的理解,才能在适当的场景正确的使用弱引用。为了加深对WeakReference的理解,下面说明下jdk自身对WeakReference的使用的例子,就是ThreadLocal类,相信很多人都了解ThreadLocal类的作用,但也许还不知道ThreadLocal与WeakReference的关系,ThreadLocal有个静态内部类ThreadLocalMap
ThreadLocalMap类构造器里创建了Entry集合来存放以ThreadLocal为key的一个value值
这个Entry对象则是继承了WeakReference类,也就是说Entry集合存放的key对象是弱引用关系
这个地方用到弱引用,即ThreadLocal对象回收不会被这里的Entry所影响