使用Android Studio进行内存使用情况分析

时间:2016-03-02 18:45:52

标签: android android-studio memory-management

我试图了解我的应用程序在哪里使用内存,以及我可以在这方面使其更有效率。

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

我看到很多归类于FinalizerReference

enter image description here

这是什么?我怎样才能更好地了解导致它的原因以及如何保持原状?查看“实例”面板对我没什么帮助......没有多大意义。

我试过看this但是现在这一切都在我的头上。

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

2 个答案:

答案 0 :(得分:0)

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

我不确定这对FinalizerReference是否有帮助,但我想做的一件事就是找到可疑对象与GC根目录的连接。

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

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

现在你应该看到一个嵌套引用列表,它从gc根目录返回到你的对象。

我不确定是什么原因造成的差异 - 这是一个similar question。显然,内存监视器工具可能只报告由Java代码生成的堆分配,而设备则报告整个进程的内存使用情况。

答案 1 :(得分:0)

如我在对my own similar question的答复中所指出的,Memory Profiler为FinalizerReference报告的“保留大小”目前是一个无意义的数字。

总结:在进行概要分析时(像Memory Profiler一样)将FinalizerReference像其他任何类一样对待,会导致在计算其保留大小时重复计数相同的内存。

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