zoukankan      html  css  js  c++  java
  • 内存溢出OOM

    如何避免OOM 异常?

    想要避免OOM 异常首先我们要知道什么情况下会导致OOM 异常。

    1、图片过大导致OOM

    Android 中用bitmap 时很容易内存溢出,比如报如下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。
    解决方法:
    方法1: 等比例缩小图片
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 2;
    //Options 只保存图片尺寸大小,不保存图片到内存
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inSampleSize = 2;
    Bitmap bmp = null;
    bmp = BitmapFactory.decodeResource(getResources(),
    mImageIds[position],opts);
    //回收
    bmp.recycle();
    以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。


    方法2:对图片采用软引用,及时地进行recyle()操作
    SoftReference<Bitmap> bitmap = new SoftReference<Bitmap>(pBitmap);
    if(bitmap != null){
    if(bitmap.get() != null && !bitmap.get().isRecycled()){
    bitmap.get().recycle();
    bitmap = null;
    }
    }


    2、Bitmap 对象不再使用时调用recycle()释放内存

    有时我们会手工的操作Bitmap 对象,如果一个Bitmap 对象比较占内存,当它不再被使用的时候,

    可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。

    3、资源对象没有关闭

    资源性对象比如(Cursor,IO流等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们, 以便它们的缓冲及时回收内存。

    查询数据库没有关闭游标:程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor 后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在长时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。

     

    4、硬件资源的释放
    Android中最典型的需要注意释放硬件资源的情况是在Activity 的生命周期中,在onPause()、onStop()、onDestroy()方法中

    需要适当的释放资源的情况,这些硬件资源可能包括:视频、音频、相机等。

     

    5、构造Adapter 时,没有使用缓存的convertView
    在使用ListView 的时候通常会使用Adapter,那么我们应该尽可能的使用ConvertView。


    6、避免内存泄漏导致OOM

    内存泄漏会导致对象无法回收,从而占用系统内存,可能导致OOM,所以我们要尽量避免内存泄漏。 

  • 相关阅读:
    celery异步任务
    redis过期策略与内存淘汰机制分析
    爬虫数据去重-布隆过滤器
    scrapy-redis数据去重与分布式框架
    redis哨兵机制
    C#从零单排上王者系列---元组
    玩转VSCode插件之Remote-SSH
    C#从零单排上王者系列---数据类型
    Cassandra之Docker环境实践
    centos7安装nginx并配置前端环境
  • 原文地址:https://www.cnblogs.com/wytiger/p/5367613.html
Copyright © 2011-2022 走看看