以下逐步对各种情况做统一分析
一.最常见的就是Bitmap的锅了
使用Bitmap必须谨慎又谨慎,可以通过以下几种方式,避免出现OOM
1.inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。
2.decode format:解码格式,选择 ARGB_8888 / RBG_565 / ARGB_4444 / ALPHA_8,存在很大差异。
3.大量图片做上传的时候,请使用异步任务处理图片,避免过于阻塞主线程的任务进度,防止界面卡死
二.资源释放问题
1.比如在Activity中register了一个BraodcastReceiver,但在Activity结束后没有unregister该BraodcastReceiver。
2.对于资源性对象在不使用的时候,应该调用它的close()函数将其关闭掉,然后再设置为null。在我们的程序退出时一定要确保我们的资源性对象已经关闭。
3.Bitmap对象不在使用时调用recycle()释放内存。2.3以后的bitmap应该是不需要手动recycle了,内存已经在java层了。
4.资源性对象比如Cursor,Stream、File文件等往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于 java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄漏。
三.Handler造成的内存泄漏
当handler持有当前activity引用,等待接收消息的时候,他一定会等待消息的接收,在这之前activity是不能被回收掉的,所以可能产生内存的泄漏
将Handler类独立出来或者使用静态内部类,这样便可以避免内存泄漏。
private static class MyHandler extends Handler {
@Override
public void handleMessage(Message message) {
super.handleMessage(message);
}
}
private static class MyRunnable implements Runnable {
@Override
public void run() {
while (true) ;
}
}
四.分享个内存工具leakcanary
// 在gradle中添加这两句话
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
// 在想监听的界面中添加依据启动的话
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LeakCanary.install(MainApplication.getInstance());
}
debug运行之后,就会出现Leaks这个应用的图标,出现OOM的时候,通知栏会有相应的体现