【问题标题】:Memory usage analysis using Android Studio使用 Android Studio 进行内存使用分析
【发布时间】:2016-06-15 19:11:52
【问题描述】:

我正在尝试了解我的应用在哪里使用内存,以及在哪些方面我可以提高它的效率。

在 Android Studio 的 Android Monitor 部分,我已经转储了 Java Heap,并且正在查看生成的 hprof。

我看到很多归类在FinalizerReference

这是什么?我怎样才能更好地理解是什么导致了它,以及如何抑制它?查看“实例”面板对我没有多大帮助……没有多大意义。

我曾尝试查看this,但目前这一切都在我的脑海中。

此外,目前内存监视器报告(在实时图表部分)分配的内存为 10.58 MB。但是在我的设备上,在 Application Manager > Running Processes 中,我的应用程序显示的内存使用量为 44MB。为什么会出现差异?如果是我想尝试减少的 ~33MB,我显然什至在 Android Studio 中都没有看到,所以没有真正的希望确定它是什么?

【问题讨论】:

标签: android android-studio memory-management


【解决方案1】:

对于FinalizerReference 内存使用,您可能无能为力。有关更多详细信息,请参阅此question - 基本上一些对象实现了finalize(),并且这些对象的处理方式略有不同,因此它们最终可能会停留更长时间。我没有仔细研究它,但我怀疑某些 android sdk 对象会这样做,除了可能调整对象缓存/回收以减少它之外,您几乎无能为力。

我不确定这对 FinalizerReference 是否有帮助,但我喜欢做的一件事是追踪内存泄漏,就是找到可疑对象与 GC 根的连接。

如果您使用的是 Eclipse hprof 分析器(独立于实际的 Eclipse IDE;与 android studio 生成的 hprofs 一起使用),这是访问它的一种方法:

  • 概述
  • 直方图
  • 右键单击,“列出对象”
  • 右键单击您怀疑正在泄漏的对象,“GC 根路径”

现在您应该会看到从 gc 根返回到您的对象的嵌套引用列表。

我不确定是什么导致了差异 - 这是一个similar question。显然内存监控工具可能只报告 Java 代码进行的堆分配,而设备报告整个进程的内存使用情况。

【讨论】:

    【解决方案2】:

    内存分析器为 FinalizerReference 报告的保留大小目前是一个毫无意义的数字,正如我在对 my own similar question 的回答中所说的那样。

    总结:在分析时像对待任何其他类一样对待 FinalizerReference(如 Memory Profiler 所做的那样),会导致在计算其保留大小时重复计算同一内存。

    我认为这是 Android Studio 的内存分析器中的一个错误,并已提交this issue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-24
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多