常見的內存泄露場景app
一、類的靜態變量持有大數據對象、如Bitmap大數據
靜態變量會長期維持對對象的引用,阻止垃圾回收線程
二、非靜態內部類的靜態實例對象
非靜態內部類會維持一個到外部內實例的引用,若是非靜態內部類的實例是靜態的就會間接長期維持着外部類的引用,阻止回收生命週期
三、資源對象未關閉,如Cursor File Socket等,這種狀況應該在finally中關閉內存
四、註冊對象未反註冊資源
未反註冊會致使觀察者列表裏維持着對象的引用,阻止垃圾回收get
五、Handler臨時性內存泄露it
Handler經過發送Message與主線程交互,Message發出以後是存儲在MessageQueue中的,有些Message也不是立刻就被處理的。在Message中存在一個 target,是Handler的一個引用,若是Message在Queue中存在的時間越長,就會致使Handler沒法被回收。若是Handler是非靜態的,則會致使Activity或者Service不會被回收。io
因爲AsyncTask內部也是Handler機制,一樣存在內存泄漏的風險。
此種內存泄露,通常是臨時性的。
預防
不要維持到Activity的長久引用,對activity的引用應該和activity自己有相同的生命週期。
儘可能使用application context代替activity context
Activity中儘可能不要使用非靜態內部類和用WeakReference代替