android关于内存溢出的异常

来源:互联网 发布:什么软件借钱最快 编辑:程序博客网 时间:2024/06/06 10:50

我在程序中,用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?