【问题标题】:Bitmap Memory Leak?位图内存泄漏?
【发布时间】:2011-10-22 15:19:01
【问题描述】:

我一直在制作一个模仿 ViewFlipper 的菜单系统,只是我自己重置了 RootView 中的图像和文本,试图避免与位图相关的 OOM。一切都很顺利,直到昨天我意识到在几次重新启动和随后的视图更改后,我会得到 Bitmap Exceeds VM budget.. 或类似的东西。我启动了分配跟踪器并试图查看没有被转储的内容,并发现这些调用是我的麻烦之源:

_stars.setBackgroundDrawable(getResources().getDrawable(R.drawable.star_1));
_button.setBackgroundResource(R.drawable.button_1); 
_image.setImageResource(R.drawable.image_1);

这显然不是所有代码,但它是跟踪器指向我的 MANY 分配的地方,如下所示:

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 变量和 Bitmap.recycle() 之外,不知道如何处理这个问题,但这涉及检查视图是否仍在使用以及可能在错误的时间回收;因此我不是粉丝。我只是在寻找一种方法来在每次退出视图时终止所有这些分配。(已经尝试将控件设置为 null onPause() 和 onDestroy(),希望他们会释放对位图的引用,因此能够将它们 GC 到 NO AVAIL)

[编辑]

我已经读过here,当您的活动完成时,Drawables 会根据需要进行处理。因此,我不应该对它们调用回收吗?至于单张Bitmap的大小,就是一张图片(480w x 720h (x4bpp/8))/1024 = ~169KB,所以好像没有成为问题。

【问题讨论】:

    标签: android bitmap garbage-collection out-of-memory recycle


    【解决方案1】:

    超出 VM 预算并不一定意味着存在泄漏。我通过尝试加载一个太大的位图引起了同样的问题。此外,如果您删除引用,它可能不会立即 GC,并且您可能仍然会耗尽内存。 你可能需要以某种方式调用.Recycle,因为我认为没有办法在你想要的时候强制GC运行,但是Recycle会在你运行它时释放位图持有的本机引用,所以你不要'不必等待 GC。

    【讨论】:

    • 我已经添加了一些编辑来解决您所说的内容,而无需在此处执行。
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 2011-09-19
    • 2012-11-19
    • 2013-10-01
    • 2012-08-17
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多