android图片压缩之图片和内存基础

1.堆(HEAP)是VM中占用内存最多的部分,通常是动态分配的。堆的大小不是一成不变的,通常有一个分配机制来控制它的大小。比如初始的HEAP是4M大,当4M的空间被占用超过75%的时候,重新分配堆为8M大;当8M被占用超过75%,分配堆为16M大。倒过来,当16M的堆利用不足30%的时候,缩减它的大小为8M大。重新设置堆的大小,尤其是压缩,一般会涉及到内存的拷贝,所以变更堆的大小对效率有不良影响

2.安卓系统对每个程序的堆内存上限限定为Max Heap Size,是堆内存的上限值,老版本Android的缺省值是16M,后来逐渐增大,但是都会有一个限制(要确定这个限制,可以new一个byte数组,看多大时会oom),app申请的堆内存大于堆内存,就会造成内存溢出(oom)

3.堆内存的大小一般是不能更改的,VMRuntime.getRuntime().setMinimumHeapSize(NewSize);这个方法其实只是改变了堆的下限值,它可以防止过于频繁的堆内存分配(根据第1点,如果开始就设置堆为8m,当内存为7m的时候,是不会重新分配内存大小的,如果是默认的4m,就会重新分配一次,可能引发内存拷贝,影响效率),当设置最小堆内存大小超过上限值时仍然采用堆的上限值,对于内存不足没什么作用。

4.默认情况下,bitmap每个像素点占用4个字节(ARGB_8888),一张3543×3503的图片差不多在内存中占用44M(3543×3503*4byte,加载这个bitmap时,还要申请其他空间,所以实际要申请的堆内存还远远大于这个值)的空间(存放在磁盘也是压缩后的,比如jpg图片,就是jpg算法压缩后存放到磁盘的),这样用bitmap加载大图片的时候,就会引发oom

5.ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 

6.Runtime.getRuntime().maxMemory() 可以获取app堆内存的最大大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值