做android都了解的,剛好有同事問,就整理了下。
內存泄露
內存泄漏,在C/C++里面指的是用malloc/new分配了內存,然后沒有進行free/delete,導致分配的內存無法回收。
Java有垃圾回收,所以Java內存泄漏一般都是指的某些無用對象因為被引用導致的無法垃圾回收,占用了不必要的內存。
可以參看QQ空間團隊這張圖
內存泄漏示意圖
Android中的內存泄漏
常見的幾種內存泄漏的情況
- static變量引用Activity的Context
寫應用的時候有時候會用到單例,一般單例用static變量保存,生命周期是整個應用程序,而訪問系統資源又需要Context,單例常常會需要保存Context
如果傳入Activity的Context會導致Activity間接的被static變量持有,無法回收導致內存泄漏。
能用Application Context代替的,盡量用Application Context。 - 匿名內部類
匿名的內部類會持有外部類的引用,導致外部類不能被回收。
比如,在Activity里面啟線程,然后線程訪問了Activity的一些成員變量,如果這個線程是長時間運行的(尤其是后臺運行的),會導致這個Activity不被回收。類似的還有用Handler去post Runnable。
Activity onStop/onDestroy的時候,能取消的延遲任務記得取消 - 注冊的回調/監聽函數
其實和匿名內部類差不多的原理,很多時候會注冊一個回調函數到底層的Service,比如在做藍牙掃描的時候,會注冊監聽,接收結果刷新Activity?;蛘咂渌愃频漠惒讲僮鳌_@些內部的非靜態的回調對象都會持有Activity的引用,導致Activity無法回收。
Activity onStop/onDestroy的時候,取消注冊/監聽函數