Android内存图片管理

转载 2013年12月05日 10:28:25

Android会自动管理内存,JAVA也有garbage collection (GC )内存回收机制。

但是如果程序在一次操作中打开几个M的文件,那么通常会出现下面的错误信息。

 

1.明确调用System.gc(); 

        这种内存回收会有一定的作用,但是请不要太期待。

System.gc()在调用时程序是处于阻塞状态,系统考虑到程序运行的流畅性,会分批次进行垃圾回收,每次只回收一部分,我曾经遇到过的状况是只调用了一次System.gc(),然后看到LOG显示垃圾的确回收了,但很快Out of memory便接踵而至,看来是垃圾还没有回收完,系统内存就溢出了,最后采用了一个无奈的方法,连续调用10次甚至20System.gc(),问题便解决了。

2.图片处理完成后回收内存。

        请在调用BitMap进行图片处理后进行内存回收。

  bitmap.recycle(); 

        这样会把刚刚用过的图片占用的内存释放。

3.图片读入内存时指定大小。

    BitmapFactory.Options options = new BitmapFactory.Options();
  options.inJustDecodeBounds = true;
  bitmap = BitmapFactory.decodeFile(path, options); // 此时返回bm为空
  options.inJustDecodeBounds = false;
  // 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
  int be = (int) (options.outHeight / (float) heigh);
  if (be <= 0)
   be = 1;
  options.inSampleSize = be;
  // 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
  bitmap = BitmapFactory.decodeFile(path, options);

4DrawableBitmap的区别

对比项

Bitmap

Drawable

显示清晰度

相同

相同

占用内存

支持缩放

支持色相色差调整

支持旋转

支持透明色

绘制速度

支持像素操作

 

Drawable在内存占用和绘制速度这两个非常关键的点上胜过Bitmap

 

5.问题排查

从以下几点进行分析和排查:

1

所有不再使用的类对象你置空了吗?

2

被置空的那些对象里的那些申请了内存空间的子对象(比如Bitmap对象)你释放资源以及置空了吗?

3

置空对象后有没有调用System.gc()?


6.Android框架,每一个进程都有内存限制,可以采用以下方法来躲开这个问题

每一个程序可以通过android.os.Debug.getNativeHeapAllocatedSize()查看进程可以使用的内存。

一种方法是从本机代码分配内存。使用NDK的(本地开发工具包)和JNI,它可以从C级(如的malloc / free或新/删除),这种分配的内存分配,不计入内存的限制。

另一种方法,效果很好,图像,是使用OpenGL纹理 - 纹理内存同样不被计入内存的限制

据说可以达到300M的内存使用,哪位朋友测试了可以告诉我,这个方法的可行性。

 

7.软引用

8.有MAT测试

Android 图片缓冲的管理-内存缓存

在内存中保存图片的缓存,使用LrcCache import android.graphics.Bitmap; import android.support.v4.util.LruCache;...

Android 应用性能优化--资源图片的内存管理

综述图片从来源上可以分成三大类:网络图片、手机存储中(EMMC 和Sdcard)的图片、APK资源图片,目前有很多成熟的图片加载库,主流的有Picasso 、Glide 、Fresco。但是没有覆盖A...

android中图片内存管理-防止OOM

android中图片内存管理-防止OOM 前言 最近,公司有个新需求,需要在地图上的每一个用户头像上,加上该用户当前所行驶的速度。先大概说一下地图上的一些事: 地图上单独加上的一些点(不属于...
  • niu0147
  • niu0147
  • 2014年11月13日 15:12
  • 442

【Android性能优化】Android图片加载方案--Bitmap的内存管理和优化方案

写在前面:笔者的上一篇博文有提到过,如果不恰当的使用Bitmap,很容易造成OOM。这篇博文就来谈谈应该如何正确的管理Bitmap的内存,以及优化策略。参考: Google官方教程 – 《Androi...

[置顶] 【Android性能优化】Android图片加载方案--Bitmap的内存管理和优化方案

[置顶] 【Android性能优化】Android图片加载方案--Bitmap的内存管理和优化方案 标签: Bitmap优化OOM缓存图片加载 2016-03-31 18:04 9811人...

Android 内存管理--------------图片太大内存溢出

在循环内尽量不要使用局部变量。 2.不用的对象可以把它指向NULL,并注意自己的代码质量。 3.显示让系统GC回收 (这里补充一下System.ge() 也不能随便的调用,要考虑实际情况尽量在一次...

Android内存缓存图片的标准方法

  • 2015年08月17日 16:45
  • 733KB
  • 下载

设置SDWebImage中maxCacheSize动态管理图片内存缓存大小无效。maxCacheSize和maxMemoryCost的定义和使用。

在按照之前我的那片博文介绍的方法修复了强引用造成的SDWebImage无法释放自己的图片缓存后,虽然它已经可以在收到内存警报时清除内存的缓存,但是却仍然会偶尔遇到闪退。自己猜测可能是因为在收到内存警报...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android内存图片管理
举报原因:
原因补充:

(最多只允许输入30个字)