• 内存溢出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,所以我们要尽量避免内存泄漏。 

  • 相关阅读:
    matplotlib: ylabel on the right
    ssh 密钥管理
    [转]Linux下创建静态、动态库
    Perl命令行应用介绍
    zz:快速编辑Shell命令行
    zz Makefile学习教程: 跟我一起写 Makefile
    Eureka服务剔除下线
    数据结构可视化
    aeImageResize jQuery图片等比缩放调整插件
    最全的CSS浏览器兼容问题整理(IE6.0、IE7.0 与 FireFox)
  • 原文地址:https://www.cnblogs.com/wytiger/p/5367613.html
Copyright © 2020-2023  润新知