学习
实践
活动
工具
TVP
写文章

android bitmap内存分配和优化

首先Bitmap在Android虚拟机中的内存分配,在Google的网站上给出了下面的一段话  ? 大致的意思也就是说,在Android3.0之前,Bitmap内存分配分为两部分,一部分是分配在Dalvik的VM堆中,而像素数据的内存分配在Native堆中,而到了Android3.0之后,Bitmap内存则已经全部分配在VM堆上,这两种分配方式的区别在于,Native堆的内存不受Dalvik虚拟机的管理,我们想要释放Bitmap内存,必须手动调用Recycle方法,而到了Android 3.0 之后的平台,我们就可以将Bitmap内存完全放心的交给虚拟机管理了,我们只需要保证Bitmap对象遵守虚拟机的GC Root Tracing的回收规则即可。 接下来分几个要点来谈谈如何优化Bitmap内存问题。

85160

Android系统Bitmap内存分配原理与优化

在这篇文章中,笔者将讲解一张看似普通的Bitmap内存的占用,介绍Android Studio中帮助我们分析图片占用内存的工具,举例说明流行的两大图片加载框架:Glide、Picasso在加载图片时使用内存的不同方式 ,接着分析不同drawable目录下图片的显示策略,最后基于手机内存、版本,提出一种优化内存分配的方案。 选中Bitmap对象,直接在窗口的Bitmap Preview中查看图片内容(如上图),非常方便。 $ adb shell wm densityPhysical density: 560 那么同一个图片放在不同目录下,对分配内存是否有影响呢? 在布局里创建两个ImageView,观察这两张图片最终的显示效果,以及分配内存情况。

44820
  • 广告
    关闭

    热门业务场景教学

    个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    (转载非原创)Android系统Bitmap内存分配原理与优化

    在这篇文章中,笔者将讲解一张看似普通的Bitmap内存的占用,介绍Android Studio中帮助我们分析图片占用内存的工具,举例说明流行的两大图片加载框架:Glide、Picasso在加载图片时使用内存的不同方式 ,接着分析不同drawable目录下图片的显示策略,最后基于手机内存、版本,提出一种优化内存分配的方案。 选中Bitmap对象,直接在窗口的Bitmap Preview中查看图片内容(如上图),非常方便。 $ adb shell wm densityPhysical density: 560 那么同一个图片放在不同目录下,对分配内存是否有影响呢? 在布局里创建两个ImageView,观察这两张图片最终的显示效果,以及分配内存情况。

    26020

    图片系列(6)不同版本上 Bitmap 内存分配与回收原理对比

    为此,Google 也在不断尝试优化 Bitmap内存分配和回收策略,涉及:Java 堆、Native 堆、硬件等多种分配方案,未来会不会有新的方案呢? : 创建像素数据的内存分配器,默认使用 Native Heap 内存分配器(HeapAllocator),如果使用了 inBitmap 复用会采用其他分配器; 步骤 3 - 预分配像素数据内存: 使用内存分配器预分配内存分配像素数据内存 // tryAllocPixels():创建 Native Bitmap 对象并预分配像素数据内存 if (! : 创建像素数据的内存分配器,默认使用 Java Heap 内存分配器(JavaPixelAllocator),如果使用了 inBitmap 复用会采用其他分配器; 步骤 3 - 预分配像素数据内存: 预分配像素数据内存空间,并创建 Native Bitmap 对象; 步骤 4 - 解码: 使用解码器解码,并写入到预分配内存; 步骤 5 - 返回 Java Bitmap 对象: 创建 Java Bitmap

    15710

    Android内存优化-Bitmap内存优化

    在日常开发中,我们不免会使用到Bitmap,而bitmap确实实在在的是内存使用的 “大户”,如何更好的使用 bitmap,减少其对 App内存的使用,是我们开发中不可回避的问题。 这时候就可以按一定的采样率来将图片缩小后在加载进来,这样图片既能在ImageView显示出来,又能降低内存占用从而在一定程度上避免OOM,提高了Bitmap加载时的性能。 基础了解 我们先了解一下,Bitmap到底占用多大的内存Bitmap作为位图,需要读入一张图片每一个像素点的数据,其主要占用内存的地方也正是这些像素数据。 对于像素数据总大小,我们可以猜想为:像素总数量 x 每个像素的字节大小,而像素总数量在矩形屏幕的表现下,应该是:横向像素数量 x 纵向像素数量,结合得到: Bitmap内存占用 = 像素数据总大小=横向像素数量 简书-Android-Bitmap内存优化。

    22330

    Bitmap内存计算

    本文聚焦的问题 1、Bitmap中像素数据占用多大内存?如何计算? 2、不同图片来源对内存大小有什么影响? (以Android 8.0+平台为例,这行代码执行后占用的总内存大小=bitmap在栈上的引用大小+bitmap指向的堆中的对象大小+指向的对象持有的native像素数据大小,先只关注像素数据,以后再研究其他几部分的内存占用如何计算 如果宽高不变,用Bitmap.Config.RGB_565格式加载,则大小=100x100x2byte。 这是在内存中直接创建的一个bitmap,其他来源的图片加载成bitmap大小会有所不同? 一张100×100的png图片,放在下面各个不同位置,以720×1080像素4.8寸的手机(像素密度305,属于xhdpi)去加载,都加载为ARGB_8888格式,计算加载后的bitmap像素数据内存大小 xhdpi设备上,要缩小320/480倍,加载后bitmap宽高75×75,内存75x75x4byte res/drawable-xxhdpi文件夹计算方式类似。

    11020

    Zephyr 内存分配

    内存分配 内存片 概述 内存片(memory slab) 是一个内核对象 允许从指定的内存区域上动态地分配内存块 允许从指定的内存区域上动态地分配内存块(memory block) 内存池中的内存块的大小是不固定的 内存池使用"伙伴"(buddy )内存分配算法 API 定义内存池 struct k_mem_pool 内存池只能使用 K_MEM_POOL_DEFINE 分配内存块 int k_mem_pool_alloc(struct k_mem_pool *p, struct k_mem_block *block, size_t size 堆内存池智能定义一个 堆内存池大小是可配置的,支持256、1024、4096和16384字节 内存分配后,它的前16字节将被内核用于记录块描述符,

    38220

    Bitmap内存优化

    所以,对于图片的内存优化,是Android应用开发中比较重要的内容。 1) 要及时回收Bitmap内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。 仔细查看BitmapFactory的源代码可以看到,生成Bitmap对象最终都是通过JNI调用方式实现的。所以,加载Bitmap内存里以后,是包含两部分内存区域的。 这个Bitmap对象是由Java部分分配的,不用的时候系统就会自动回收了,但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。 2) 捕获异常 因为Bitmap是吃内存大户,为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常以后Crash掉,需要特别注意实例化Bitmap部分的代码。 使用BitmapFactory.Options设置inJustDecodeBounds为true后,再使用decodeFile()等方法,并不会真正的分配空间,即解码出来的Bitmap为null,但是可计算出原始图片的宽度和高度

    71450

    android计算bitmap内存内存优化

    内存 = 新图的高度 * 新图的宽度 * 每像素大小 参数看下面: 每像素大小根据options中的: Bitmap.Config.ARGB_8888 : 8bit + 8bit + 8bit + 内存复用 Bitmap bitmap = BitmapFactory.decodeResource(mResources, RES_IDS[curFrame], options () + " AllocationByteCount : " + bitmap.getAllocationByteCount()); } bitmap.getByteCount() :bitmap使用内存的理论值 bitmap.getAllocationByteCount() :使用options.inBitmap时,bitmap实际使用的内存内存优化: 1、设置inSampleSize 2、不影响用户体验的情况下:Bitmap.Config.ARGB_4444 举例: 1、 2、

    12010

    连续内存分配

    为了提高响应速度,内存之中需要驻留多个进程来实现这一性能改进。现在就需要考虑内存分配。 在内存分配之前,我们需要知道内存保护的问题。首先,用户进程之间彼此不能影响,用户进程也不能影响操作系统。 连续内存分配是最简单的一种方法,它主要用于批处理系统。给内存分为固定大小的块。每个块只能容纳一个进程。这样一个个大小不同的内存分块就形成了,当新进程需要内存的时候,系统会为它找一块足够大的孔。 如果孔很大,那么剩余的部分还会作为一个孔,当进程退出的时候,它将释放内存。如果新的孔和旧的孔在一起,那么可以合并它们。但是新进程需要内存的时候,将哪个合适的孔分配给它? 不连续的小孔最终就会无法容纳一个进程,导致产生碎片化的内存。还有一种碎片是内部碎片,一般系统分配内存是2的次方,而不是你需要多大分配的就刚好是这么大。 这样只要有物理内存就可以为进程分配。主要有两种实现方案分页和分段。它们还可以合并使用。

    45620

    C语言动态内存分配:按需分配内存

    6410

    java内存分配

    形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。 应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配内存是自动初始化的。 Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配内存实际建立这个对象,而在堆栈中分配内存只是一个指向这个堆对象的指针 堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。 但缺点是,由于要在运行时动态分配内存,存取速度较慢。   栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

    62650

    数组大小分配(动态内存分配

    这种分配固定大小内存分配的方法称为静态内存分配。 为了解决这个问题,提出了动态内存分配。所谓动态内存分配是指在程序执行的过程中动态地分配或者回收存储空间的内存分配方法。 动态分配不像数组等静态内存分配方法需要预先申请内存空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。 从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点: 不需要预先分配内存空间 分配的空间可以根据程序的需要扩大或缩小 1.如何实现动态内存分配及其管理 要实现根据程序的需要动态分配存储空间 free函数释放已经不用的内存区域。所以有这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。

    75520

    Go 内存管理 -- 内存分配

    接上一篇,下面来看看内存分配的初始化、分配等。 初始化 首先会申请一段连续的内存空间以供使用,大小(64位机器上)512M(spans_mapped)+16G(bitmap_mapped)+512G(arena)。 内存分配 针对于不同大小的的对象,go的分配策略是不同的: (0, 16B) 且不包含指针的对象: Tiny分配 (0, 16B) 包含指针的对象:正常分配 [16B, 32KB] : 正常分配 (32KB, -) : 大对象分配 Tiny分配和大对象分配都属于内存管理的优化范畴,这里就仅看正常分配。 go的内存分配非常复杂,中间还有很多GC的细节在里面,一言半语的也说不详细,大家可以对着简单的纲要直接看源码,注释也非常详细,一定要对照上一篇的图来理解go内存管理。

    40330

    Go 内存管理 -- 内存分配

    小对象分配 小对象内存分配默认会分配86个不同大小的块,这些块的大小不一致,内部采用单链表数组来组织内存,使用时遵循懒加载策略,等到使用时才进行初始化。 ? image.png 大对象分配 大于32k的内存申请,属于大对象的分配,使用全局缓存堆直接分配内存的组织方式也是通过单链表数组进行的,数据长度是256,每个链表的元素的大小是不同的,但都是4k(1page image.png Span tcmalloc使用span来管理内存分页,一个span可以包含几个连续分页。span的状态只有未分配、作为大对象分配、作为小对象分配。 go内存分配 主流程 1、申请一块较大的虚拟内存空间,用于内存分配及管理 当空间不足时,向系统申请一块较大的内存,如100KB或者1MB 申请到的内存块按特定的size,被分割成多种小块内存(go: 总体来说,他们之间的关系是这样的: Golang程序启动时申请一大块内存,并划分成spans、bitmap、arena区域,arena区域按页划分成一个个小块,span管理一个或多个页,mcentral

    48110

    图解golang内存分配

    我们知道所有程序运行都需要使用内存,而内存的管理和分配又是非常重要的,它决定了你的程序能不能在有限的资源内跑的更快。可以设想一下,如果你自己来设计的一个内存分配的规则,会遇到什么问题呢? 如果你有了一大块内存你要怎么去合理的分配和使用呢?今天我们通过几张图来看看golang中的内存分配是怎样的。 (这里虽然写了它是512G,但是你心里要有B数,你电脑根本没这么大的内存,其实操作系统只是给了你地址而已)同时几个page组合在一起的大房间又叫做mspan(这个是golang中内存管理的基本单元) bitmap 然后我们再来看第二大的bitmap,它是用来表示arena中存放的对象的一些信息,包括这个对象GC标志,还有标识这个对象是否包含指针。 这其实也很好理解,golang在进行垃圾回收的时候是根据引用的可达性分析来确定一个对象是否可以被回收,同时采用的是三色标记法进行标记对象,所以这里需要有bitmap来保存这些信息。

    10220

    Java内存管理(一、内存分配

    关于Java内存分配,很多问题都模模糊糊,不能全面贯通理解。 一、Java内存分配 1、 Java有几种存储区域? Java对象的内存总是在heap中分配。 4、Java内存分配实例解析 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。 堆内存分配      JVM初始分配内存由-Xms指定,默认是物理内存的1/64;      JVM最大分配内存由-Xmx指定,默认是物理内存的1/4。       非堆内存分配      JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;      由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

    2K30

    Memcache内存分配策略

    Page为内存分配的最小单位。Memcached的内存分配以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定。 如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。 Slab的内存分配。Memcached在启动时通过-m指定最大使用内存,但是这个不会一启动就占用,是随着需要逐步分配给各slab的。          如下图,slab 1和slab 2都分配了一个page,并按各自的大小切分成chunk数组。 Memcached内存分配策略。 综合上面的介绍,memcached的内存分配策略就是:按slab需求分配page,各slab按需使用chunk存储。

    41720

    Android Bitmap 内存溢出的问题

    opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI>> /* 以最省内存的方式读取本地资源的图片    * @param context  * @param resId  * @return  */ ublic static Bitmap openRawResource(resId);     return BitmapFactory.decodeStream(is,null,opt);      }   3.优化Dalvik虚拟机的堆内存分配       对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了优化Dalvik虚拟机的堆内存分配

    79130

    Netty Unpooled 内存分配

    Netty里的内存管理是通过ByteBuf这个类作为桥梁连接着业务代码与jdk底层的内存。所以理解ByteBuf的结构就很有必要了。 ByteBuf ByteBuf的内部结构如下图: ? ByteBuf类结构图 ByteBuf分类 Pooled和Unpooled:pooled类型的bytebuf是在已经申请好的内存块取一块内存,而Unpooled是直接通过JDK底层代码申请。 Unsafe和非Unsafe:这里的Unsafe是JDK底层的对象,通过它能够直接操作到内存。 Heap和Direct:一个是在堆上分配,一个是直接内存。Direct不受GC的控制。 ByteBufAllocator类图 UnpooledByteBufAllocator分配heap内存 通过调用heapBuffer方法分配一块heap内存 ? UnpooledByteBufAllocator分配direct内存 UnpooledByteBufAllocator类的newDirectBuffer方法 ?

    1K20

    扫码关注腾讯云开发者

    领取腾讯云代金券