【问题标题】:Potential causes of memory leaks in AndroidAndroid中内存泄漏的潜在原因
【发布时间】:2015-08-06 13:02:50
【问题描述】:

我正在使用leakcanery 来查找 Android 中的内存泄漏。我发现并修复了所有Activity 泄漏。 (惊讶地知道有这么多顺便说一句!)。 我还为我所有的Fragments 添加了手表refWatcher

问题 1:还有什么我应该注意的可能会导致明显的内存泄漏的事情吗?

问题 2: 既然Fragment 持有对它的Activity 的引用,那么观看Fragment 泄漏不是多余的吗?反正我收到通知了,对吧? :-/

问题 3: 当我在 android studio 中检查内存监视器时,它会显示内存使用量随时间的增长。这是一个巨大的内存泄漏的迹象还是安卓操作系统很友好,它只是给了我更多的内存?如何确定?

【问题讨论】:

标签: java android memory-leaks garbage-collection


【解决方案1】:

还有什么我应该注意的可能会导致明显的内存泄漏的事情吗?

  • 声明成员字段static 几乎可以保证内存泄漏。
  • 持续超过父类生命周期的匿名类,例如 Volley Requests,也会产生内存泄漏,因为它们持有对父类 Activity 的隐式引用,并且如果 Activity 之前消失了请求调用完成,发生内存泄漏。

由于Fragment 包含对其Activity 的引用,因此观看Fragment 泄漏不是多余的吗?

Fragment 不会“持有”对Activity 的引用。参考由FragmentManager 提供。但框架会在内部进行管理,因此您无需担心。

当我在 android studio 中检查内存监视器时,它会显示内存使用量随时间的增长。这是一个巨大的内存泄漏的迹象还是安卓操作系统很友好,它只是给了我更多的内存?我怎样才能确定?

应用程序的内存增长是自然的,并且在垃圾收集器的后续通道中清理内存。在具有虚拟机和自动垃圾收集器的语言中,程序员几乎无法控制内存分配。除了造成微小的内存泄漏之外,程序员几乎无法搞砸内存管理过程。

【讨论】:

  • “将成员字段声明为静态几乎可以保证内存泄漏。” - 对不起,但没有依据。我一直在使用静态,Android 源代码本身就有很多。
猜你喜欢
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多