1

所以我有一个图像滑块,它是一个带有图像的 ViewPager,您可以水平滑动以移动到下一个图像。

在将新图像加载到图像滑块之前,我在每个位图上调用 mBitmap.recycle() 以确保我没有浪费内存

检查 Android Studio 中的内存监视器显示,在 Android 4.4 (Dalvik) 中,这可以正常工作,每次加载新图像时,它总是下降到没有加载图像时使用的内存量。

在 Android 5.0 及更高版本中,情况并非总是如此。如果您横向滚动并至少查看图像滑块中的每个图像一次,当您加载一组新图像时,会有一些剩余的垃圾没有被收集,这很奇怪,因为我在每个图像上都明确调用了 recycle()图片。

这会使 heapSize 较低(如 96MB)的手机崩溃,而在 heapsize 较大(如 256MB)的手机上,您可以多次复合此问题,直到大约 100MB 的未收集垃圾和 90MB 的合法已用内存。

一旦它达到 190/256MB 的那个点,垃圾收集系统似乎开始“工作”,但我仍然不确定 Bitmap.recycle() 调用实际上在做什么。当堆需要重新调整自身时,它每次都会释放大量内存,比如 20MB,但简单地调用垃圾收集(通过单击 Android Studio 中的按钮)并没有这样做,它只会在以下情况下消除少量开销在图像之间滑动。

总结一下:如果没有看到图像滑块/ ViewPager 中的图像,则 Bitmap.recycle() 会按预期执行,但是如果您至少看到它们中的每一个,则垃圾收集似乎忽略了 Bitmap.recycle()

这是一张显示我正在谈论的内容的图片(这是针对 Android v5.0(ART),请参阅 v4.4(dalvik) 的另一张图片。

在此处输入图像描述

如果您对我对正在发生的事情的解释有任何疑问,我可以澄清一下。

编辑:这是在 Android 4.4 上执行相同操作时的样子。请注意,每次调用 recycle() 时,它都会下降到约 20MB 的内存,这与我的应用程序使用的内存有关,不包括位图。

图片: Android v4.4 内存监视器示例

4

0 回答 0