常見的記憶體洩漏以及如何解決它們

1.修復你的背景:

嘗試使用適當的上下文:例如,因為 Toast 可以在許多活動中看到而不是隻有一個,所以使用 getApplicationContext() 進行 toast,並且即使活動已經結束,服務也可以繼續執行,啟動服務:

Intent myService = new Intent(getApplicationContext(), MyService.class);

使用此表作為適當的上下文的快速指南: StackOverflow 文件

關於上下文的原始文章

2.對 Context 的靜態引用

嚴重的記憶體洩漏錯誤是保持對 View 的靜態引用。每個 View 都有一個 Context 的內部參考。這意味著在應用程式終止之前,不會對具有整個檢視層次結構的舊 Activity 進行垃圾回收。旋轉螢幕時,你的應用程式將在記憶體中使用兩次。

確保絕對沒有靜態引用 View,Context 或它們的任何後代。

3.檢查你是否真正完成了服務

例如,我有一個使用 Google 位置服務 API 的 intentService。我忘了呼叫 googleApiClient.disconnect();

//Disconnect from API onDestroy()
if (googleApiClient.isConnected()) {
    LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, GoogleLocationService.this);
    googleApiClient.disconnect();
}

4.檢查影象和點陣圖的用法:

如果你使用 Square 的庫 Picasso 我發現我沒有使用 .fit() 洩漏記憶體,這大大減少了我的記憶體佔用平均從 50MB 到小於 19MB:

Picasso.with(ActivityExample.this)                   //Activity context
                .load(object.getImageUrl())           
                .fit()                                //This avoided the OutOfMemoryError
                .centerCrop()                         //makes image to not stretch
                .into(imageView);

5.如果你使用廣播接收器,請取消註冊

6.如果你使用 java.util.Observer(觀察者模式):

一定要使用 deleteObserver(observer);