美文网首页
Android内存溢出和内存泄漏

Android内存溢出和内存泄漏

作者: 正义吖 | 来源:发表于2017-03-24 15:18 被阅读84次
  • 内存溢出 (OOM)是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如只申请了一个integer,但给它存了long才能存下的数,那就会出现内存溢出。
  • 内存泄露 (memory leak)是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
  • 内存泄漏最终会导致内存溢出。

大部分的OOM都是发生在图片加载上的,当我们加载大图时,需要特别注意避免OOM的发生。

  • 处理大图片时,不管你的手机内存有多大,如果不对图片进行处理,都有可能会发生内存溢出问题。
  • 1、在内存中压缩图片
    装载大图片时需要对图片进行压缩,使用等比例压缩的方法直接在内存中处理图片
Options options = new BitmapFactory.Options(); 
options.inSampleSize = 5; // 原图的五分之一,设置为2则为二分之一 
BitmapFactory.decodeFile(myImage.getAbsolutePath(), options);

这样做要注意的是,图片质量会变差,inSampleSize设置的值越大,图片质量就越差,不同的手机厂商缩放的比例可能不同。

  • 2、使用完图片后回收图片所占内存** 由于Android外层是使用java而底层使用的是C语言在里层为图片对象分配的内存空间。 所以我们的外部虽然看起来释放了,但里层却并不一定完全释放了,我们使用完图片后最好再释放掉里层的内存空间。
if (!bitmapObject.isRecyled()) {     // Bitmap对象没有被回收 
     bitmapObject.recycle();     // 释放 
     System.gc();     // 提醒系统及时回收 
}  
  • 3、降低要显示的图片色彩质量
    Android中Bitmap有四种图片色彩模式:
    ALPHA_8:每个像素需要占用内存中的1byte
    RGB_565:每个像素需要占用内存中的2byte
    ARGB_4444:每个像素需要占用内存中的2byte
    ARGB_8888:每个像素需要占用内存中的4byte
    我们创建Bitmap时,默认的色彩模式是ARGB_8888的,这种色彩模式是质量最高的,当然这样的模式占用的内存也最大。
    而ARGB_4444每个像素只占用2byte,所以使用ARGB_4444的模式也能降低图片占用的内存大小。

  • 4、查询图片信息时不把图片加载到内存中
    有时候我们取得一张图片,也许只是为了获得这个图片的一些信息,比如图片的width、height等信息,不需要显示到界面上,这个时候我们可以不把图片加载到内存中。

BitmapFactory.Options options = new BitmapFactory.Options(); 

options.inJustDecodeBounds = true; // 不把图片加载到内存中 

Bitmap btimapObject = BitmapFactory.decodeFile(myImage.getAbsolutePath(), options); 

如何避免内存泄漏?

1,在 onDestroy()方法中显示调用mThread.close();以此来结束该线程,这就避免了线程的内存泄漏问题。
2,使用application context 代替activity context;
3,资源对象没关闭造成的内存泄漏,如Cursor没有close掉;
4,Bitmap记得recycle掉;
5,构造Adapter时,没有使用缓存的convertView。

相关文章

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

  • leakcanery2源码

    LeakCanary是Android上用于检查内存泄漏的工具,LeakCanary大大减少因内存泄漏导致的内存溢出...

  • 【Android测试】内存泄漏检测 LeakCanary

    什么是内存泄漏和内存溢出?内存泄漏有什么危害?LeakCanary检测内存泄漏? 内存泄漏(Memory Leak...

  • 内存溢出和内存泄漏

    1.内存泄漏 2.内存溢出 -如何避免内存泄漏、内存溢出?

  • 面试总结 | 记一次Android 面试

    Android中的内存泄漏和内存溢出有什么区别?内存溢出是指程序在申请内存的时候,没有足够的内存可以分配,导致Ou...

  • 面试经历:记一次Android面试

    Android中的内存泄漏和内存溢出有什么区别? 内存溢出是指程序在申请内存的时候,没有足够的内存可以分配,导致O...

  • Android 非静态内部类/匿名类/Handler引起的内存泄

    一、内存溢出和内存泄漏 内存溢出:Android系统会给每个安卓程序分配一定的内存,当程序所使用的内存超过最大值就...

  • 使用 Memory Profiler 排查内存泄露

    使用 Memory Profiler 排查内存泄漏 内存泄漏和内存溢出 **Memory Profiler **是...

  • JVM

    1. 内存溢出和内存泄漏 内存溢出是说程序需要申请的内存超过了JVM当前可以分配的最大内存,溢出。内存泄漏是说期望...

  • 【JVM】内存溢出分析

    一 内存溢出概述 都有发生内存溢出异常(OutOfMemoryError,简称OOM)的可能。 内存溢出和内存泄漏...

网友评论

      本文标题:Android内存溢出和内存泄漏

      本文链接:https://www.haomeiwen.com/subject/dwrfottx.html