在Java里, 當一個對象o被創建時, 它被放在Heap里. 當GC運行的時候, 如果發現沒有任何引用指向o, o就會被回收以騰出內存空間. 或者換句話說, 一個對象被回收, 必須滿足兩個條件: 1)沒有任何引用指向它 2)GC被運行.
導致內存泄漏例子:
A a = new A();
B b = new B(a);
a = null;
1356321982_8457.jpg
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,使用時需判空