常见的内存泄漏以及如何解决它们
1.修复你的背景:
尝试使用适当的上下文:例如,因为 Toast 可以在许多活动中看到而不是只有一个,所以使用 getApplicationContext()
进行 toast,并且即使活动已经结束,服务也可以继续运行,启动服务:
Intent myService = new Intent(getApplicationContext(), MyService.class);
使用此表作为适当的上下文的快速指南:
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);