1、使用说明还是从测试例子开始说明,首先添加一个TestWeakReference测试例子/*** 测试弱引用* Created by shaowei on 2017/8/14.*/public class TestWeakReferece { public static void main(String[] args) { Object o = new Object(); WeakReference<Object> weak = new WeakReference<Object>(o); 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!"); }}
2、运行测试代码,打印结果如下,从结果中可以看出,循环打印了10次weak.get()都不为空,在第十次调用了System.gc(),之后weak.get()显示为空,则说明被gc回收了
3、从示例代码中可以看出,WeakReference对象一直持有o对象,就是因为WeakReference类是弱引用持有o对象,才没有影响到垃圾回收器对o对象的回收。我们后续使用WeakReference时,就如图本例测试代码一样去构造WeakReference对象然后持有我们需要弱引用控制的类
4、WeakReference使用方法非常简单,主要是对WeakReference这个类的理解以及对java内存垃圾回收机制的理解,才能在适当的场景正确的使用弱引用。为了加深对WeakReference的理解,下面说明下jdk自身对WeakReference的使用的例子,就是ThreadLocal类,相信很多人都了解ThreadLocal类的作用,但也许还不知道ThreadLocal与WeakReference的关系,ThreadLocal有个静态内部类ThreadLocalMap
5、ThreadLocalMap类构造器里创建了Entry集合来存放以ThreadLocal为key的一个value值
6、这个Entry对象则是继承了WeakReference类,也就是说Entry集合存放的key对象是弱引用关系
7、这个地方用到弱引用,即ThreadLocal对象回收不会被这里的Entry所影响