2016-03-02 89 views
4

我想了解我的应用在哪里使用内存,以及在哪里可以使其在这方面更加高效。使用Android Studio的内存使用情况分析

在Android Studio的Android监视器部分,我已经抛弃了Java堆,并且正在查看生成的hprof。

而且我看到FinalizerReference下分类颇多:

enter image description here

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

我已经试过看this,但这一切都略微超过了我的头。

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

+0

如果你有内存泄漏,看看这是否有帮助。 FinalizerReference很好,不应该有GC根。 http://ramannanda.blogspot.com/2015/04/analyzing-memory-leaks-in-android.html?m=1 –

回答

0

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

我不确定这是否有助于FinalizerReference,但我想跟踪内存泄漏的一件事是找到可疑对象与GC根目录的连接。

如果你现在使用Eclipse HPROF分析(独立于实际的Eclipse IDE的;使用Android Studio生成hprofs作品),这是访问的方式之一:

  • 概述
  • 直方图
  • 用鼠标右键单击“对象列表”
  • 右键单击您怀疑泄漏的对象,“路径GC根所”

现在您应该可以看到从GC根目录返回到您的对象的嵌套引用列表。

我不完全确定是什么原因导致的差异 - 这里是similar question。显然,内存监视器工具可能只报告Java代码所做的堆分配,而设备报告整个进程的内存使用情况。