1. 程式人生 > >Android開發常見記憶體洩露--非靜態內部類引起的記憶體洩露

Android開發常見記憶體洩露--非靜態內部類引起的記憶體洩露

網上文章一大堆,關於記憶體洩露的。這裡只是自己記憶一下。
常見的包括
1、單例造成的記憶體洩露(單例靜態特性使得生命週期等同與應用生命週期,若單例中持有物件的引用,使得物件使用完後不能被銷燬,造成記憶體洩露。建立單例,若需要使用上下文,傳入application的context)。

2、非靜態內部類建立靜態例項(非靜態內部類預設持有外部類的引用,使外部類不能被回收)。

3、Handler造成的記憶體洩露(Handler類似2中的非靜態內部類,持有外部Activity的引用,似的Activity的資源不能被回收–解決:靜態Handler+弱引用,並且Activity退出時Handler取消正在傳送的訊息,防止Looper佇列中還有未處理的訊息)。

4、匿名內部類造成的記憶體洩露(如在建立執行緒時new Thread與new Runnable都是匿名內部類,預設持有外部類的引用,Activity銷燬時,執行緒中任務沒有執行完,Activity不會被回收)。

5、資源未關閉造成的記憶體洩露(對於使用了BraodcastReceiver,ContentObserve,File,Cursor,Steam,Bitmap等資源時,Activity退出時要及時關閉)。

2、3、4屬於同一種情況, 非靜態內部類建立靜態例項。
內部類分為靜態內部類跟非靜態內部類,靜態內部類定義在外部類內部,編譯時與外部類沒有直接的關係,但是非靜態內部類編譯時,編譯器會預設新增外部類的引用,建立靜態例項時,會造成外部類不能被回收,引起記憶體洩露。