`
phenom
  • 浏览: 405902 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

android bitmap内存限制

 
阅读更多
http://phenom.iteye.com/blog/1541291
(DOC)Displaying Bitmaps Efficiently
这篇是翻译的,
此次是实践,是关于Android系统的图片解码的实例
文中说到:
摄像头在GalaxyNexus拍一张照片有2592*1936像素,如果bitmap使用ARGB_8888配置(2.3默认的),加载这张照片到内存需要消耗约19mb内存,(2592*1936*4bytes)
19m的内存对模拟器的16m来说,显然太大了,但对于真实的机器 ,还是可以的

至于说Android的图片内存8m,这个不知道是听谁说的,总之我也没有找到标准的答案,有可能是在Android刚出来的时候定义的一个堆大小,我觉得最有可能的是这个值作为图片解码的内存大小,却不是对图片的大小限制的.所以上面的图片是可以解码显示出来的.

先说下情况:
一张440*17514大小的图片,直接在galaxy上解析,然后得到Bitmap,再放到ImageView中显示,一切正常的.说下galaxy的情况:
/system/build.prop中的heapsize=64m
两种方法,一种是argb_8888配置,一种 是rgb_565

实践也表明了,两种图片解码后的效果差不多的,如果不是图像处理,完全可以用rgb_565来处理图片的显示,

显然这张图片解析需要29m左右的内存,<64m.所以我觉得Android的内存限制不是只是图片上,而是整个进程的,当进程占用的内存没有超过这个值,就是正常的,而,解析图片通常是最耗内存的操作.

在ImageView中显示一张,argb_8888,然后再解码一次,29*2+其它的操作,对象内存,勉强>64m了,只能解码一次.
使用rgb_565解码一次15m左右,可以有四次的机会,为什么不是三次呢,29*2<64,但一次解析大图,消耗的其它对象内存也大了.

于是修改了/system/build.prop中的heapsize=48m,重启了,
再运行,argb_8888一次解码正常的.二次崩溃.
使用rgb_565解码,可以两次,三次崩溃.

于是修改了/system/build.prop中的heapsize=24m,重启了,
再运行,argb_8888一次崩溃.
使用rgb_565解码,可以一次,第二次崩溃.

,由此可见,不是一张大的图不可以显示出来,通常一张拍摄的照片像2592*1936这样的,有这样的分辨率,就有相应的机器对应,所以内存也就大了,不是所谓的8m.

由于只分析了一些实践结果,对系统的代码没有研究,有可能这是不对的,或许
c对解码图片作了一些内存上的限制.

但是可以知道,8m的内存是不对的,即使现在新机器中最烂的也不小于512m的内存,heapsize也>24m,所以对于上面这种大的图片,使用rgb_565解码,是没有问题的.

final int memClass = ((ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
		System.out.println("memClass:"+memClass);

可以得到这个值的大小.

最近做的微博程序中大图浏览直接崩溃,内存不足,64m的内存,缓存各种图片64张,图片大小大约是在400*1600,几十张图片加载后就崩溃了.

当然如果没有必要,还是缩放一下较好:
BitmapFactory.Options options = new BitmapFactory.Options();
使用缩放的效果明显要比使用rgb_565解码糟糕的多了.




分享到:
评论

相关推荐

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    大图片所引起的内存问题

    在我们android开发中,一个应用使用的内存大小是有限制的.在应用中,如果大量的使用bitmap就很可能导致内存溢出的问题。比如我在曾经的一个项目中遇到的问题:要使用Gallery来显示多张不同的图片,在给Gallery的每个...

    Android加载图片内存溢出问题解决方法

    2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出。Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存OOM,只有在BitmapFactory加载图片时使用...

    新版Android开发教程.rar

    � 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要快很多。 � 运营商(中国移动等)的大力支持,产业链条的热捧。 � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、...

    Android应用程序开发教程PDF电子书完整版、Android开发学习教程

    Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型 。 Linux 内核也同时作为硬件和软件栈之间的抽象层。 5 建立 Android Android Android Android 开发环境 ① ...

    浅析KJFrameForAndroid框架如何高效加载Bitmap

    我想这个问题不必在强调了,每个人在最初学习Android的时候肯定都会知道这么一个原因:我们编写的应用程序都是有一个最大内存限制,其中JAVA程序和C程序(NDK调用时)共享这一块内存大小,程序占用了过高的内存就...

    Android实现旋转,放大,缩小图片的方法

    但由于手机内存是有限制的,在放大几倍以后,就会core掉。 后面直接选用imageview来完成此项任务,很遗憾,虽然不会重复生成bitmap导致core掉,但是imageview的大小限制是图片无法再放大或放大也只能在这个区域中。 ...

    Android库让乐高飞任何图像-Android开发

    请参见实际应用程序:功能将任何位图转换为合法版本高档低分辨率位图将输出大小限制为1080px,以避免出现内存不足异常如何使用将Jitpack存储库添加到项目中:存储库{maven {url“ https:// jitpack.io“}}在库上...

    Android中的图片优化完全指南

    fresco花费很多精力在5.0系统之前把Bitmap内存改回到native,高版本上面则遵循系统实现,却又被官方打脸。 jvm每个进程都有内存上限,而native则没有限制(不是没有影响,至少不会oom),所以把内存大户Bitmap挪到...

    Android开发之图片压缩实现方法分析

    由于Android本身的机制限定 由于系统对每个应用内存分配规则的限制,如果加载过大图片很有可能会导致OOM 即闪退或者卡屏现象 但是手机上拇指大小的图片,超清是完全没有必要的 这是我们就需要对 对片进行压缩处理: ...

    Android高效安全加载图片的方法详解

    在这些情况下,加载图片都需要占用大量的内存,而 Android系统分配给每个进程的内存空间是有限的,如果加载的图片所需要的内存超过了限制,进程就会出现 OOM,即内存溢出。 本文针对加载大图片或者一次加载多张图片...

    Android高效加载大图、多图解决方案 有效避免程序OOM

    本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文。 ... 高效加载大图片 ...大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现O

    Android 图片缓存机制的深入理解

    很多情况下(像ListView、GridView或ViewPager等组件),屏幕上已显示的图片和即将滑动到当前屏幕上的图片数量基本上是没有限制的。 这些组件通过重用已经移除屏幕的子视图来将降低内存的使用,垃圾回收器也会及时...

    Android 加载大图、多图和LruCache缓存详细介绍

    大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少 int maxMemory = (int) (Runtime....

    Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常

    大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少。 int maxMemory = (int) (Runtime.

    Android中加载网络资源时的优化可使用(线程+缓存)解决

    下面提出一些优化: 1、采用线程池 2、内存缓存+文件缓存 3、内存缓存中网上很多是采用SoftReference来防止堆溢出,这儿严格限制只能使用最大JVM内存的1/4 4、对下载的图片进行按比例缩放,以减少内存的消耗 具体的...

    360黑科技DroidPlugin.zip

    图标通过R.drawable.XXX指定的通知(插件系统会自动将其转化为Bitmap)无法在插件中注册一些具有特殊Intent Filter的Service、Activity、BroadcastReceiver、ContentProvider等组件以供Android系统、已经安装的其他...

    DroidPlugin插件机制

    限制和缺陷: 无法在插件中发送具有自定义资源的Notification,例如: a. 带自定义RemoteLayout的Notification b. 图标通过R.drawable.XXX指定的通知(插件系统会自动将其转化为Bitmap) 无法在插件中注册一些具有...

Global site tag (gtag.js) - Google Analytics