冰楓論壇

 找回密碼
 立即註冊
查看: 217|回覆: 0

[心得] 談談java中的WeakReference

  [複製鏈接]

17

主題

0

好友

15

積分

新手上路

Rank: 1

UID
126691
帖子
38
主題
17
精華
0
積分
15
楓幣
1
威望
15
存款
0
贊助金額
0
推廣
0
GP
16
閱讀權限
10
性別
保密
在線時間
5 小時
註冊時間
2016-1-20
最後登入
2018-12-18
發表於 2018-2-13 20:49:51 |顯示全部樓層

本文只針對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產生了依賴,我們再用一個接近內存結構的圖來表達:

1356321287_6500

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);

1356321982_8457

當a=null ,這個時候A只被弱引用依賴,那麼GC會立刻回收A這個對象,這就是弱引用的好處!他可以在你對對象結構和拓撲不是很清晰的情況下,幫助你合理的釋放對象,造成不必要的內存洩漏!!


已有 1 人評分楓幣 收起 理由
love6610716 + 1

總評分: 楓幣 + 1   查看全部評分

ewfwefwewegegweg gegwgwegwegwgegegwegwwegwgweg
您需要登入後才可以回帖 登入 | 立即註冊

正在連接伺服器...
打開冰楓聊天室
廣告刊登意見回饋關於我們職位招聘

Copyright © 2011-2019 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|意見反饋|手機版|Archiver|冰楓論壇

GMT+8, 2019-7-20 02:45

APP Store下載 Play Store下載
回頂部