泄漏的未引用的byte []最初来自位图但是循环()导致内存泄漏(直到活动停止)

时间:2016-01-25 18:34:32

标签: android memory memory-leaks bitmap out-of-memory

我的位图内存泄漏导致内存不足。我在Android 5.0(三星S5)上运行测试。我使用Android Studio(1.5.1 + 2.0.0 Preview 7)调查了这个问题。 HPROF内存转储显示有多个byte [],它们与我临时使用的特定巨大位图完全对应。如果我确保我保留对位图的引用,那么Android Studio会向我显示一个11MB主导大小的位图和一个11MB浅大的byte []。如果我不保留对位图的引用,那么一些位图将被垃圾收集,一些位于byte []而没有传入引用(即没有父级),如图所示。

enter image description here

我已经对我的应用程序进行了足够的测试,以确切地知道这个11MB字节[]是我在内存中的大致2891x1000x4位图。一些较小的位图也会泄露并显示没有传入的引用。

上面的位图是以子活动分配的。如果我返回到父活动(在同一进程中,因此dalvikVM)并强制2x GC,则释放内存。多个手动GC在退出子活动之前不会释放内存。

我是否独立运行bitmap.recycle()似乎是独立的。如果我只是站在应用程序中的相同位置并运行从同一视图生成大位图的代码,则很少发生。如果我在应用程序中移动并从不同视图生成位图,则会更频繁,例如从50%泄漏到10%泄漏。

  • 这是一个Android错误吗?
  • 我是否以某种方式使用错误的位图,Android工作室无法向我显示正确的内存视图?
  • 我的理解是否正确如果下面的参考树中没有父母(见图),那么内存应该由垃圾收集器发布(因此它是Android Bug或工作室bug或hprof dump-bug?)

1 个答案:

答案 0 :(得分:0)

我找到了泄漏的解决方案,虽然Android Studios报道了未引用的字节[]仍然是一个谜。

看来我在其中做过的ImageView

imageView.setImageBitmap(bitmap)

将阻止GC位于byte []下的位图。 bitmap.recycle()没有帮助,unbinddrawables()也没有在很多地方写的

if (imageView.getBackground() != null) {
    imageView.getBackground().setCallback(null);
}
setImageBackground(imageView, null);
imageView.setImageBitmap(null);
imageView.setImageDrawable(null);

当我从viewhiearchy中删除了视图并删除了我对视图的所有引用时,则字节[]被GC格式化并且泄漏消失了。