关于弱引用WeakReference的一点疑问

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

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

虽然垃圾回收器的优先级很低,但是不能保证在我们使用对象的时候它不执行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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值