談談java中的WeakReference

java語言中爲對象的引用分爲了四個級別,分別爲 強引用 、軟引用、弱引用、虛引用。java

本文只針對java中的弱引用進行一些分析,若有出入還請多指正。函數

在分析弱引用以前,先闡述一個概念:什麼是對象可到達和對象不可到達狀態。spa

其實很簡單,我舉個例子:orm

如今有以下兩個類class A class B,在JVM上生成他們兩個類的實例分別爲 instance a  instance b對象

有以下表達式:內存

A a = new A();it

B b = new B();class

兩個強引用對象就生成了,好吧,那麼這個時候我作一下修改:內存泄漏

A a = new A();構造函數

B b = new B(a);

B的默認構造函數上是須要一個A的實例做爲參數的,那麼這個時候 A和B就產生了依賴,也能夠說a和b產生了依賴,咱們再用一個接近內存結構的圖來表達:

 

a是對象A的引用,b是對象B的引用,對象B同時還依賴對象A,那麼這個時候咱們認爲從對象B是能夠到達對象A的。

因而我又修改了一下代碼

A a = new A();

B b = new B(a);

a = null;

A對象的引用a置空了,a再也不指向對象A的地址,咱們都知道當一個對象再也不被其餘對象引用的時候,是會被GC回收的,很顯然及時a=null,那麼A對象也是不可能被回收的,由於B依然依賴與A,在這個時候,形成了內存泄漏!

那麼如何避免上面的例子中內存泄漏呢?

很簡單:

A a = new A();

B b = new B(a);

a = null;

b = null;

這個時候B對象再也沒有被任何引用,A對象只被B對象引用,儘管這樣,GC也是能夠同時回收他們倆的,由於他們處於不可到達區域。

 

弱引用來了!

A a = new A();

WeakReference wr = new WeakReference(a);

//B b = new B(a);

 

當 a=null ,這個時候A只被弱引用依賴,那麼GC會馬上回收A這個對象,這就是弱引用的好處!他能夠在你對對象結構和拓撲不是很清晰的狀況下,幫助你合理的釋放對象,形成沒必要要的內存泄漏!!

相關文章
相關標籤/搜索