所以我有一个图像滑块,它是一个ViewPager,带有一个可以水平滑动以移动到下一个的图像。
在将新图像加载到图像滑块之前,我在每个位图上调用mBitmap.recycle()以确保我不浪费内存
检查Android Studio中的内存监视器显示,在Android 4.4(Dalvik)中,这种方式正常工作,每次加载新图像时,它总是会降低到没有加载图像时使用的内存量。
在Android 5.0及更高版本中,并非总是如此。如果你向侧面滚动并至少查看一次图像滑块中的每个图像,当你去加载一组新的图像时,会有一些不会被收集的剩余垃圾,这是奇怪的,因为我明确了在每张图片上都叫做recycle()。
这会降低heapSize较低的手机(如96MB),而且在堆大(如256 MB)的手机上,你可以将这个问题复合几次,直到大约100MB的未收集垃圾和90MB的合法使用内存。
一旦它达到190 / 256MB的那一点,似乎垃圾收集系统启动"工作"但我仍然不确定Bitmap.recycle()调用实际上是在做什么工作。当堆需要重新调整自己时,它每次释放大量内存,比如20MB,但只是调用垃圾收集(通过点击Android工作室中的按钮)不会这样做,它只会删除少量的内存在图像之间滑动时的开销。
总结一下:如果没有看到图像滑块/ ViewPager中的图像,Bitmap.recycle()会按预期执行,但如果你看到它们中的每一个至少一次,那么垃圾收集似乎忽略了Bitmap。再循环()
这是一张显示我正在谈论的内容的图片(适用于Android v5.0(ART),请参阅v4.4(dalvik)的其他图片。
如果您对我发生的事情的解释有任何疑问,我可以澄清。
编辑:这是在Android 4.4上执行相同操作时的样子。注意每次调用recycle()时它会降低到大约20MB的内存,这与我的应用程序使用的不计算位图有关。