Android Dalvik Vs.使用ViewPager和Bitmap.recycle进行ART垃圾收集

时间:2016-06-24 18:34:41

标签: android bitmap garbage-collection dalvik android-runtime

所以我有一个图像滑块,它是一个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)的其他图片。

enter image description here

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

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

图像: Android v4.4 memory monitor example

0 个答案:

没有答案