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這個對象,這就是弱引用的好處!他可以在你對對象結構和拓撲不是很清晰的情況下,幫助你合理的釋放對象,造成不必要的內存洩漏!!
歡迎光臨 冰楓論壇 (https://bingfong.com/) | Powered by 冰楓 |