WeakReference使用教程

2025-10-17 06:06:45

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!");

    }

}

WeakReference使用教程

2、运行测试代码,打印结果如下,从结果中可以看出,循环打印了10次weak.get()都不为空,在第十次调用了System.gc(),之后weak.get()显示为空,则说明被gc回收了

WeakReference使用教程

3、从示例代码中可以看出,WeakReference对象一直持有o对象,就是因为WeakReference类是弱引用持有o对象,才没有影响到垃圾回收器对o对象的回收。

我们后续使用WeakReference时,就如图本例测试代码一样去构造WeakReference对象然后持有我们需要弱引用控制的类

WeakReference使用教程

4、WeakReference使用方法非常简单,主要是对WeakReference这个类的理解以及对java内存垃圾回收机制的理解,才能在适当的场景正确的使用弱引用。为了加深对WeakReference的理解,下面说明下jdk自身对WeakReference的使用的例子,就是ThreadLocal类,相信很多人都了解ThreadLocal类的作用,但也许还不知道ThreadLocal与WeakReference的关系,ThreadLocal有个静态内部类ThreadLocalMap

WeakReference使用教程

5、ThreadLocalMap类构造器里创建了Entry集合来存放以ThreadLocal为key的一个value值

WeakReference使用教程

6、这个Entry对象则是继承了WeakReference类,也就是说Entry集合存放的key对象是弱引用关系

WeakReference使用教程

7、这个地方用到弱引用,即ThreadLocal对象回收不会被这里的Entry所影响

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢