談談java中的WeakReference

來源:互聯網
上載者:User

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

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

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

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

現在有如下兩個類class A class B,在JVM上產生他們兩個類的執行個體分別為 instance a  instance b

有如下運算式:

A a = new A();

B b = new B();

兩個強引用對象就產生了,好吧,那麼這個時候我做一下修改:

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這個對象,這就是弱引用的好處。他可以在你對對象結構和拓撲不是很清晰的情況下,協助你合理的釋放對象,造成不必要的記憶體流失。。


來源:http://blog.csdn.net/matrix_xu/article/details/8424038

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.