android 記憶體洩露

2021-08-22 06:00:26 字數 1855 閱讀 6986

記憶體洩露情況:

1:使用單例導致記憶體洩露

public class singleton 

public static singleton getsingleton(context context)

return singleton;

}}

原因:靜態的單例使它的生命週期與應用的生命週期一樣長,context一般傳的是activity或者service等上下文,如果退出activity,activity就沒有用了,但是靜態單例還會持有activity的引用,導致無法**,導致記憶體洩露。

2.webview造成的記憶體洩露

原因:webview載入網頁後會長期占用記憶體而不能釋放

處理:在activity的destory()時銷毀它,釋放記憶體

@override

protected void ondestroy()

3.動畫造成的記憶體洩露

原因:activity在銷毀的時候沒有呼叫cancel方法,動畫引用控制項,控制項引用activity,所以activity無法正常釋放

處理:在activity的destory()時銷毀它,釋放記憶體

@override

protected void ondestroy()

4.資源未關閉導致記憶體洩露

處理:使用io,cursor後,關閉。

outputstream out = null;  

try catch (exception e) finally

} catch (exception e)

}

cursor cursor = null;

try }catch(exception e)finally

}

5. 註冊廣播,未關閉,操作記憶體洩露

處理:在activity的destory()時銷毀它,釋放記憶體

@override

protected void ondestroy()

}

6.非靜態內部類導致記憶體洩露,比如handler

原因1:activity關閉了,handle的messagequue消佇列裡還有下次沒有訊息處理或者正在處理,導致activity無法**。

處理:使用靜態內部類加弱引用

public class classmodelactivity extends activity 

@override

public void handlemessage(message msg) }}

}

上面可以避免actiity記憶體洩露,但是messagequeue訊息佇列中可能還有訊息訊息,所以也將它清理調掉

@override

protected void ondestroy()

}

7.匿名內部類物件導致activit不能被**

原因:直接new執行緒或者new asynctask,匿名內部類物件預設隱式持有activity物件的引用

處理:像上面一樣使用靜態內部類加弱引用的方式。

8. timer和timertask導致記憶體洩露

原因:activity關閉時,timer還在等待執行timertask,它持有activity物件,導致activity不能被**

處理:activity銷毀時,呼叫timer和timertask的cancel方法。

@override

protected void ondestroy()

Android記憶體洩露

android應用記憶體洩漏的的原因有以下幾個 1查詢資料庫後沒有關閉游標cursor 2 構造adapter時,沒有使用 convertview 重用 3 bitmap物件不在使用時呼叫recycle 釋放記憶體 4 物件被生命週期長的物件引用,如activity被靜態集合引用導致activity...

android 記憶體洩露總結

一 引用沒釋放造成的記憶體洩露 1.註冊沒有取消造成的記憶體洩露 2.集合容器物件沒有清理造成的記憶體洩露,僅僅是顯示的賦為了null 3.不要保留對context activity長時間的引用,對activity的引用,一定要確保擁有和activity一樣的生命週期 4.如果你不想控制內部類的生命...

Android記憶體洩露利器(RSS記憶體統計篇)

前言 rss resident set size 表示實際使用物理記憶體 包含共享庫占用的記憶體 因為它包含了共享記憶體,所以他的意義不及pss。所以現在檢視記憶體使用情況一般參照pss。因此現在一般不使用getprocessstate.bat,而是使用getmemorystate.bat andr...