常见的内存泄漏以及如何解决它们

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);