消除過期的對象引用

第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é)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是過期的對象引用? 我們通過簡單的棧實(shí)現(xiàn)來引入過期的對象引用。 實(shí)際上,這段程序中并沒有很明顯的錯(cuò)誤。無論如何...
    大海孤了島閱讀 1,033評論 1 2
  • 如圖所示的例子,這段程序中沒有明顯的錯(cuò)誤,但是存在一個(gè)隱藏的問題(“內(nèi)存泄漏”),隨著垃圾回收活動(dòng)的增加,或者由于...
    郭_4d5f閱讀 510評論 0 0
  • 很多人可能在想這么一個(gè)問題:Java有垃圾回收機(jī)制,那么還存在內(nèi)存泄露嗎?答案是肯定的,所謂的垃圾回收GC會自動(dòng)管...
    Ruheng閱讀 1,735評論 0 5
  • 問題的引出 這段程序有一個(gè)“內(nèi)存泄露”,隨著GC活動(dòng)的增加,或者由于內(nèi)存占用的不斷增加,程序性能降低會逐漸表現(xiàn)出來...
    每天學(xué)點(diǎn)編程閱讀 574評論 0 4
  • 你能看出以下代碼哪里內(nèi)存泄漏嗎? 答案是: pop()方法存在內(nèi)存泄漏。 內(nèi)存泄漏可以稱為“ 無意識的對象保持(u...
    DeppWang閱讀 269評論 0 2

友情鏈接更多精彩內(nèi)容