Android 位图内存泄漏?
我一直在制作一个菜单系统,模仿ViewFlipper,只是我自己在RootView中重置了图像和文本,试图避免与位图相关的OOM。一切都很顺利,直到昨天,我才意识到在重新启动几次之后,以及随后的视图更改之后,我得到的位图超出了虚拟机预算。。或者类似的东西。我启动了allocation tracker,试图查看哪些电话没有被丢弃,并发现这些电话是我的麻烦源:Android 位图内存泄漏?,android,bitmap,garbage-collection,out-of-memory,recycle,Android,Bitmap,Garbage Collection,Out Of Memory,Recycle,我一直在制作一个菜单系统,模仿ViewFlipper,只是我自己在RootView中重置了图像和文本,试图避免与位图相关的OOM。一切都很顺利,直到昨天,我才意识到在重新启动几次之后,以及随后的视图更改之后,我得到的位图超出了虚拟机预算。。或者类似的东西。我启动了allocation tracker,试图查看哪些电话没有被丢弃,并发现这些电话是我的麻烦源: _stars.setBackgroundDrawable(getResources().getDrawable(R.drawable.sta
_stars.setBackgroundDrawable(getResources().getDrawable(R.drawable.star_1));
_button.setBackgroundResource(R.drawable.button_1);
_image.setImageResource(R.drawable.image_1);
这显然不是所有的代码,但它是跟踪器指向我的许多分配的地方,如下所示:
258 72 android.graphics.BitmapFactory$Options 1 android.graphics.drawable.Drawable
481 68 android.graphics.drawable.BitmapDrawable 1 android.graphics.drawable.Drawable
482 52 android.graphics.Paint 1 android.graphics.Bitmap createBitmap
479 52 android.graphics.Paint 1 android.graphics.drawable.BitmapDrawable$BitmapState
255 36 android.graphics.Bitmap 1 android.graphics.BitmapFactory
254 36 android.graphics.Canvas 1 android.graphics.Bitmap createBitmap
250 36 android.graphics.Bitmap 1 android.graphics.Bitmap nativeCreate
123 36 android.graphics.Bitmap 1 android.graphics.BitmapFactory
我想知道的是,这正常吗?或者我在什么地方有漏洞吗?在测试后,我的分配中至少有10-20个漏洞,最终不可避免地我碰到了OOM。除了使用位图变量,然后可能使用Bitmap.recycle(),不确定如何处理此问题,但这涉及检查视图是否仍在使用,以及是否在错误的时间循环使用;因此我不是一个粉丝。我只是在寻找一种方法,每次退出视图时都会终止所有这些分配。(已经尝试将控件设置为null onPause()&onDestroy(),希望它们释放对位图的引用,从而能够对它们进行GC,但没有用)
[编辑]
从那以后,我读到当你的活动结束时,可以根据需要处理拖拽物。所以我不应该给他们打电话,是吗?至于单个位图的大小,它只是一个图像(480w x 720h(x4bpp/8))/1024=~169KB,所以这似乎不是问题。超过虚拟机预算并不一定意味着存在泄漏。我试图加载一个位图,但这个位图太大了,导致了同样的问题。此外,如果删除引用,它可能不会立即执行GC,并且可能仍然会耗尽内存。
您可能需要调用
.Recycle
,因为我不认为有什么方法可以在需要时强制GC运行,但是Recycle
将在运行位图时释放位图持有的本机引用,这样您就不必等待GC了。我添加了一些编辑,这些编辑可以解决您所说的问题,而不必在这里执行。