第6條:消除過期的對象引用
1. 為什么要消除過期的對象引用
java雖然有自己的垃圾回收機(jī)制,但是并沒有那么的智能,對于被引用的對象,就算我們已經(jīng)不在使用它了,但是java的回收機(jī)制是不會回收他們的,人們稱之為“內(nèi)存泄漏”。
2. 無意識的對象引用
很多時(shí)候內(nèi)存泄漏都是“人們無意識的內(nèi)存引用”造成的,舉個(gè)簡單的例子:
List<String> list = new ArrayList<>();
String str = "testString";
list.add(str);
str = null;
上面的代碼在創(chuàng)建str時(shí)的開辟的內(nèi)存空間被回收了么?答案是否定的,list依然持有對str的引用,所以創(chuàng)建str時(shí)所開辟的內(nèi)存空間是不會被回收的,這就是一個(gè)典型的“無意識的內(nèi)存引用”。為了防止這些“無意識的內(nèi)存引用”,我們應(yīng)該了解對象相互引用的時(shí)候是存在怎樣的依賴關(guān)系的。
3. 一個(gè)例子秒懂對象間相互依賴是怎樣的
問題:
Object object1 = new Object();
Object object2 = object1;
Object object3 = object2;
請問object1, object2, object3和new出來的內(nèi)存空間是怎樣相互引用的呢?
-
選項(xiàng)A:
選項(xiàng)A.png -
選項(xiàng)B:
選項(xiàng)B.png
直接給答案,正確答案是B。
所以說下面這段代碼,new 出來的那片內(nèi)存空間是不會被回收的,因?yàn)閛bject2和object3還在持有這片內(nèi)存的引用。
Object object1 = new Object();
Object object2 = object1;
Object object3 = object2;
object1 = null;
4. 對于內(nèi)存泄漏不要過分緊張
不要因?yàn)楹ε聝?nèi)存泄漏而在所有的地方都手動(dòng)回收內(nèi)存,這樣會導(dǎo)致我們的代碼凌亂臃腫,不利于管理,我們應(yīng)該把目標(biāo)集中在那些長聲明周期的變量中,哪些是長生命周期的變量呢,最明顯的一個(gè)就是static修飾的變量,我們應(yīng)該把目光放在這些變量上。
5. 解決之道
對于長生命周期的變量,我們可以進(jìn)行手動(dòng)回收,或者使用弱引用(WeakReference),java中的引用分好多種,想要學(xué)習(xí)可以bing或是google,這部分內(nèi)容有點(diǎn)多,而我又已經(jīng)差不多懂了,所以就不記錄這么多了。
本篇文章到此結(jié)束。

