Memory leak
- 指因程式錯誤,導致未能釋放已經沒在使用的內部記憶體空間,浪費記憶體空間。
- Performance的隱性敵人就是memory leak,發現不論電腦或是手機都會有越用越頓的問題,就是因為memory leak導致可使用的記憶體越來越少之故。
- Memory leak造成的主因,就是某個已經被配置(allocated)的記憶體,無法被參照(referenced)也無法被釋放(released),無法再被系統使用。
- Memory leak在c / c++是常見的人為疏失,因為不同於java有Garbage collection的機制,programmer必需在使用後自行釋放空間。
Garbage Collection仍會有Memory leak
- 雖然Java與c#本身有Garbage Collection機制,但仍會發生memory leak的問題。
- 由於Garbage Collection機制,本身設定是有任何物件仍被referenced,就不會回收該記憶體,也造成發生memory leak的可能性。
- Example:
- 假設有一static array儲存目前開啟的視窗,此時User開啟了一個視窗w1,而w1也儲存到array中。
- 接下來,user將w1關閉,但程式卻沒將w1從array中移除。
- 此時,就會造成memory leak的現像,因為Garbage Collection會認為,w1仍有array在referenced它,還有機會使用到,但w1卻已經指向null。
Android Cursor leak
- Cursor leak與memory leak類似,Android和資料庫連接時多半透過provider,而查詢回來的資料,會用cursor來指向回傳的table,並從中取得資料
- Cursor leak就是cursor開啟並與資料庫溝通時,遲遲沒有關閉,當運行一段時間後,該程式開啟了過多的cursor,最後導致Exection,最後只能等資料庫的thread重啟後,才能恢復正常。
- 當cursor被Garbage Collection回收後,卻沒有在回收前進行close,就會產生此現象。
- Example:
private void method() {
Cursor cursor = query();
if (flag == false) { // !!提前返回
return;
}
cursor.close();
}
- 上述例子就顯示,該methods可能提前結束,但卻未執行到cursor.close()。
- http://www.cnblogs.com/imouto/archive/2013/01/14/how-to-detect-leaked-cursor.html
文章標籤
全站熱搜
