在Java里, 當一個對象o被創(chuàng)建時, 它被放在Heap里. 當GC運行的時候, 如果發(fā)現(xiàn)沒有任何引用指向o, o就會被回收以騰出內(nèi)存空間. 或者換句話說, 一個對象被回收, 必須滿足兩個條件: 1)沒有任何引用指向它 2)GC被運行.
導(dǎo)致內(nèi)存泄漏例子:
A a = new A();
B b = new B(a);
a = null;
1356321982_8457.jpg
A對象的引用a置空了氯材,a不再指向?qū)ο驛的地址塑悼,我們都知道當一個對象不再被其他對象引用的時候脱茉,是會被GC回收的,很顯然及時a=null红符,那么A對象也是不可能被回收的,因為B依然依賴與A,在這個時候种蘸,造成了內(nèi)存泄漏鞠值!
使用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
這樣不會造成內(nèi)存泄漏,其中b.getA()會返回null,使用時需判空