关于弱引用WeakReference的一点疑问

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/anhenzhufeng/article/details/81207401

很多文章都这样解释弱引用:

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

虽然垃圾回收器的优先级很低,但是不能保证在我们使用对象的时候它不执行gc啊。按照字面理解就是一旦执行了gc,那么弱引用包裹的对象就会被回收。如果真是这样理解的话,那么我们Android中handler中就经常使用了弱引用来引用activity,那我手动gc的时候,这个activity是会被回收了吗?(当然不会)这显然不符合现实现象。

看一下这个例子:

public class Gc {
    public static void main(String[] args) {
        Object object = new Object();
        WeakReference<Object> weak = new WeakReference<>(object);
        System.out.println("weak:" + weak.get());
//        object = null;
        System.gc();
        System.out.println("weak gc:" + weak.get());
    }
}

上面这段代码,即便我手动执行了gc,最后那个打印的还是能得到object的对象值。因为此时object指向的对象在执行gc时还被Gc的main方法引用着。

输出如下:

weak:java.lang.Object@6e0be858
weak gc:java.lang.Object@6e0be858

然后再看下这个:

public class Gc {
    public static void main(String[] args) {
        Object object = new Object();
        WeakReference<Object> weak = new WeakReference<>(object);
        System.out.println("weak:" + weak.get());
        object = null;
        System.gc();
        System.out.println("weak gc:" + weak.get());
    }
}

在执行gc前,手动把object对象置空了,object这个变量指向的 new Object()对象(假设为o)指向为null,此时o没有被任何对象强引用,所以此时执行gc后,weak得到的对象就是空的了。

weak:java.lang.Object@6e0be858
weak gc:null

在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它(或者说gc root不可达), 2)GC被运行.

也就是说,只有我们所有的对这个对象的强引用都置为null的时候,这个时候gc才能回收被WeakReference包裹的对象。

参考:

https://blog.csdn.net/zmx729618/article/details/54093532

猜你喜欢

转载自blog.csdn.net/anhenzhufeng/article/details/81207401