我在程序中,用GridView 加载网络上的图片时,出现如下异常:

164200-byte external allocation too large for this process.

VM won't let us allocate 164200 bytes


Google后得到信息是 Android的Dalvik VM为一个应用提供了大约16MB的内存,一般我们处理超过8MB的图片将会出现OutOfMemoryError异常(内存溢出异常)

想不明白的是:

1 、处理超过8MB的图片 指的是单张的图片大于8M,还是整个应用中所有图片加起来大于8M

2、按上面的异常中为什么164200 bytes 时就出现了这个异常? 164200 bytes 算下来不过才不到0.2M


继续查,在网上看到了这篇文章 :Android Bitmap内存限制

其中有这么一段话,能够解释上述两个疑问。 “为了确保我们外部分配内存成功,我们应该保证当前已分配的内存加上当前需要分配的内存值,大小不能超过当前堆的最大内存值,而且内存管理上将外部内存完全当成了当前堆的一部分 ”

虚拟机为堆分配的默认大小为16M, 我的程序 在申请0.2M空间出现了OOM提示,是否是“当前已分配的内存”已大于16-0.2M;

按此种说法,问题1自然也就不存在了,不管图像的大小有多大,只要能保证“当前已分配的内存加上当前需要分配的内存值” 不大于16M即可。


上文的作者还写了一篇文章,解决加载图像时的OOM异常:Android中解决图像解码导致的OOM问题


8M图片的思想来源

android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制 ,而且它们之间不能共享,也就是说,native内存用完了,也不能使用dalvik的内存

如果说超过8MB的图片将会出现OutOfMemoryError异常”,那是不是可以理解为 native 和 dalvik 平分了16M?


更多相关文章

  1. Android如何获取视频首帧图片
  2. android广告自动滚动并用picasso实现图片加载
  3. android百度地图自定义marker,使用网络图片
  4. Android(安卓)Studio图片框
  5. Android(安卓)异步加载图片-AsyncTask
  6. Android(安卓)开机图片/文字/动画 修改
  7. Dalvik 和 ART
  8. Android中TextView显示插入的图片实现方法
  9. Android实现BMP和PNG转换为JPEG格式

随机推荐

  1. 如何在SQL Server中使用随机记录集
  2. 如何在SQL Server 2014中用资源调控器压
  3. SQL Server把某个字段的数据用一条语句转
  4. SQL Server根据分区表名查找所在的文件及
  5. SQL Server中使用Trigger监控存储过程更
  6. SQL Server查询数据库中表使用空间信息实
  7. SQL Server中通配符的使用示例
  8. SQL语句实现查询当前数据库IO等待状况
  9. SQL语句实现查询并自动创建Missing Index
  10. SQL语句实现查询Index使用状况