Android如何避免内存泄露及内存溢出(OOM)

以下逐步对各种情况做统一分析

一.最常见的就是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的时候,通知栏会有相应的体现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值