Java WeakReference的理解与使用

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


导致内存泄漏例子:

A a = new A();
B b = new B(a);
a = null;


Java WeakReference的理解与使用_第1张图片

A对象的引用a置空了,a不再指向对象A的地址,我们都知道当一个对象不再被其他对象引用的时候,是会被GC回收的,很显然及时a=null,那么A对象也是不可能被回收的,因为B依然依赖与A,在这个时候,造成了内存泄漏!

使用WeakReference解决:

public class B
{
  WeakReference weakA;
  public B(A a)
  {
    WeakReference weakA = new WeakReference(a);
  }
  public A getA()
  {
    return weakA.get();
  }
}
A a = new A();
B b = new B(a);
a = null;
b.getA();   // 返回null

这样不会造成内存泄漏,其中b.getA()会返回null,使用时需判空

参考资料

  • Java WeakReference的理解与使用

你可能感兴趣的:(Java WeakReference的理解与使用)