【问题标题】:Android Drawables memory leakAndroid Drawables 内存泄漏
【发布时间】:2012-09-15 14:33:58
【问题描述】:

我使用了几个大型可绘制对象,但我不知道如何管理内存泄漏。 我跟踪了我的应用程序的堆大小,它不会停止增长(作为分配的内存)。

尤其是“字节数组(byte[])”类型,一直在增长,从不减少。 (在 Eclipse 的 DDMS 堆视图中)

我的应用程序由一个使用片段的活动组成。 这些片段正在显示几个大图像。 我尝试将drawables回调设置为null,将drawables设置为null,当我弹出一个片段但堆从未减少时清除我的易失性缓存(这可以防止我的应用程序执行过多的磁盘IO)。

事实上,每次我调用: Drawable.createFromResourceStream(context.getResources(), value, new FileInputStream(f), f.getName(), opts); 堆长大了。如何释放内存?

谢谢!

【问题讨论】:

    标签: android memory-leaks drawable


    【解决方案1】:

    当 Java 在内存中发现您的代码引用的对象时会发生内存泄漏,这会阻止垃圾收集器释放此内存。 Android 中的一个常见原因是引用 Activity 上下文而不是 Application 上下文。确保您的上下文引用了应用程序(即使用getApplicationContext 而不是使用this。查看此video 以了解有关内存泄漏的说明,并查看此question

    【讨论】:

    • 我引用的是应用程序上下文而不是活动上下文,你认为问题是我的片段永远不会被破坏并且它们会泄漏?
    • 也许,查看我对如何使用 SDK 内存分析工具 (MAT) 查找泄漏对象的回答中的视频
    • 嘿!我解决了我的问题!事实上,我的片段被保存在内存中,是我的静态易失性缓存保存了它。我真的不知道为什么它有这种行为。我实例化了一个 DrawableManager,当我创建一个片段时,它有几种方法可以从磁盘或通过网络检索 Drawables。当它向我的视图传递一个时,它将它保存在一个静态 HashMap 中(以便在我的其他片段中重用这个缓存)。我只是让我的 HashMap 不是静态的(不能在片段之间重用易失性缓存)。我不知道为什么我的片段被保存在内存中。
    【解决方案2】:

    问题似乎已得到解答,但 Romain Guy 的帖子似乎与获取更多信息相关:Avoiding Memory Leaks

    显然,如果您(例如)使用 setBackgroundDrawable* 将可绘制对象设置为文本视图的背景图像(从而将可绘制对象附加到视图),则更改可绘制对象的方向(销毁 Activity 并重绘 UI)仍然可以访问旧 Activity(在旧 Activity 销毁之后),从而造成内存泄漏。

    *(作为旁注 - setBackgroundDrawable 一直是deprecated since API level 16

    【讨论】:

    • ...然而即使在 API 24 中,setBackgroundDrawable 仍然在内部被 setBackground 调用。:)
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2014-08-05
    • 2015-07-20
    • 2013-08-23
    • 2020-08-15
    相关资源
    最近更新 更多