及時消除不使用的物件的引用, 理論上, 帶有記憶體管理的語言是不存在記憶體洩漏的, 但是如果對物件的操作不當,也是可能會造成記憶體洩漏.
如有乙個stack, 其pop函式如下.
public object pop()
if( element.length() == 0) return null;
return element[size—];
這樣的**初看好像沒有什麼問題, 當棧增加再減少後, 原來的陣列中仍然存在被pop的那個物件的引用! 正確答案應該是:
public object pop()
if( element.length() == 0) return null;
object ele = element[—size];
element[size] =null;
return ele;
然而實際上,我們不用在程式中寫滿類似***=null的情況, 類似這樣的處理應該是例外的少數做法而不能看成常規做法, 否則程式的結構就不夠清晰.
一般說來,只有當乙個類自己管理記憶體時,才要小心記憶體洩漏.
還兩個地方,乙個是快取, 被快取的物體經常被遺忘.
還有就是listener和callback的函式, 經常是註冊後, 在不使用了,忘記了"derigster」, 導致這塊相關的記憶體不無清除
Effective Java 學習筆記(5)
盡量復用物件,而不是建立新的物件,特別是當乙個物件是immutable 不可改變 的時候。如string物件,string s new string string 千萬不要這樣做,因為這裡實際上建立了兩個物件。要避免出現這樣的情況,1是可以用靜態工廠函式,來解決,如類庫中的boolean.value...
Effective Java 學習筆記 6
及時消除不使用的物件的引用,理論上,帶有記憶體管理的語言是不存在記憶體洩漏的,但是如果對物件的操作不當,也是可能會造成記憶體洩漏.如有乙個stack,其pop函式如下.public object pop if element.length 0 return null return element s...
Effective Java 學習筆記 7
finalizer 不可計畫的,也是危險的,一般也是不必要的.不能在finalizer中放任何與依賴時間相關的操作,因為你不知道它什麼時候被執行.比如在finalizer中關閉檔案的做法就是錯誤的,根據jvm的實現方式不同,有可能導致開啟的檔案數過多而無法再開啟檔案.也不能在finalizer中改變...