WeakReference是什么,什么时候要使用WeakReference

一个对象要被回收,需要满足两个条件:
1.没有被任何对象引用
2.GC被执行了
强引用(StrongReference)

Object o = new Object();

在现实情况中,当我们创建对象时都采用的是上面的方式,此时,引用会保存在栈中,而引用的内容会被保存在堆中。只要这种强引用还存在,GC执行时,即使是在内存不足时,JVM宁愿抛出OutofMemoryError来终止程序,也不会回收强引用的对象。

一般情况下,对于简单的对象,当调用它的方法执行完毕后,指向它的引用也会从stack中popup,等到下一次GC执行时,对象就能够被成功回收了。但对于一些特殊的对象,拥有与主程序一样的life cycle,只要程序还在运行中,它们的引用就不会被回收,导致相应的对象也不会被GC回收掉。这样的话,随着reference变得越来越多,GC无法回收的对象也越来越多,这会严重的占用内存。当然解决方法也是有的:

//当不用的时候直接置空
o = null;

这样做有问题吗?有,手动置空对于程序员来说,不但繁琐,而且违背了GC自动回收可以回收的对象的本质。

弱引用(WeakReference)

Object o = new Object();
WeakReference<Object> weakRef = new WeakReference<>(o);

以上是弱引用的使用方法,弱引用不同于强引用的地方在于:当GC执行时,如果对象没有强引用而只有弱引用时,那么该对象就会被回收。
当要获得引用对象时:

weakRef.get();

若返回为空,则代表了对象已经被回收了。
一般来说,WeakReference用于以下情况:
1.当你需要引用一个对象,但对象已经有自己的生命周期,你不想介入这个对象的生命周期。
2. 一般用weak reference引用的对象是有价值被缓存, 而且很容易被重新被构建, 且很消耗内存的对象。

软引用(SoftReference)
最后再提一下软引用,soft reference和weak reference一样, 但被GC回收的时候需要多一个条件: 当系统内存不足时,SoftReference指向的对象才会被回收。

原创文章 7 获赞 8 访问量 538

猜你喜欢

转载自blog.csdn.net/qq_43669111/article/details/104266825