我正在再次阅读http://developer.android.com/training/displaying-bitmaps/manage-memory.html。
我无法清楚地理解以下内容:
在Android 2.3.3(API级别10)及更低版本中,位图的支持像素数据存储在本机内存中。它与位图本身是分开的,位图存储在Dalvik堆中。
支持像素数据与位图对象之间的区别是什么?
答案 0 :(得分:4)
位图对象是Bitmap class的一个实例。虽然我没有在我面前的Bitmap类的源代码,但我认为它有以下私有成员变量:宽度,高度,颜色深度,“有alpha通道”,dpi等...也就是说,关于图像本身的所有元数据,程序或渲染器可能需要了解该图像。
支持像素数据是从源文件解码的实际未压缩(A)RGB字节,用于创建此位图对象的实例。因此,如果位图表示从JPEG加载的640x480 24位图像,则可能会在某处分配640x480x3字节的后备阵列,并且是Bitmap类的私有成员。像getPixel和setPixel这样的方法直接在数组上工作。
至于Dalvik vs. Native记忆的事情。要记住的是Bitmap对象使用大量内存。如果您的代码引用了太多的Bitmap对象,则可能会耗尽内存。
您列出的网络链接的完整报价:
要为本课程设置舞台,以下是Android对位图内存管理的演变: 在Android Android 2.2(API级别8)和更低,当垃圾 收集发生,您的应用程序的线程被停止。这导致滞后 这会降低性能。 Android 2.3增加了并发垃圾 集合,这意味着记忆很快就会被回收 不再引用位图。
在Android 2.3.3(API级别10)和 更低,位图的支持像素数据存储在本机存储器中。 它与位图本身是分开的,位图存储在Dalvik中 堆。本机存储器中的像素数据不会以可预测的方式释放 方式,可能导致应用程序短暂超过其 内存限制和崩溃。截至Android 3.0(API级别11),像素 数据与关联的位图一起存储在Dalvik堆上。
这句话试图说是这样的。位图使用大量内存,因为它们通常由大内存分配支持以保存ARGB字节。在今天的Android操作系统中,与位图关联的ARGB字节在不再引用时会与Bitmap对象本身一起收集垃圾。因此,只要您的Bitmap类实例没有引用泄漏,垃圾收集器就会做正确的事情,并防止内存耗尽 - 正如任何程序员可能想要的那样。
在早期版本的Android上,ARGB字节由与应用程序自己的Java / Dalvik运行时分开的不同运行时和垃圾收集器管理。所以在较旧的Android模型上,仅仅因为Bitmap对象本身被垃圾收集清理掉了,图像字节可能会在以后清理掉。因此,如果您要非常快速地连续加载和释放许多位图,即使您执行了所有操作,也可能会耗尽内存,以确保不再引用Java代码管理的Bitmap对象。