在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它 2)GC被运行.
导致内存泄漏例子:
A a = new A();
B b = new B(a);
a = null;
A对象的引用a置空了,a不再指向对象A的地址,我们都知道当一个对象不再被其他对象引用的时候,是会被GC回收的,很显然及时a=null,那么A对象也是不可能被回收的,因为B依然依赖与A,在这个时候,造成了内存泄漏!
使用WeakReference解决:
public class B
{
WeakReference<A> weakA;
public B(A a)
{
WeakReference<A> weakA = new WeakReference<A>(a);
}
public A getA()
{
return weakA.get();
}
}
A a = new A();
B b = new B(a);
a = null;
b.getA(); // 返回null
这样不会造成内存泄漏,其中b.getA()会返回null,使用时需判空