我试图了解我的应用程序在哪里使用内存,以及我可以在这方面使其更有效率。
在Android Studio的Android Monitor部分,我已经转储了Java堆,正在查看生成的hprof。
我看到很多归类于FinalizerReference
:
我试过看this但是现在这一切都在我的头上。
此外,目前内存监视器正在报告(在实时图表部分中)一个10.58 MB的分配内存。但是在我的设备上,在“应用程序管理器”中>正在运行进程,我的应用程序显示内存使用量为44MB。为什么会出现差异?如果它是〜33MB我想尝试减少,我在Android Studio中显然没有看到它,所以没有真正希望确定它是什么?
答案 0 :(得分:0)
关于FinalizerReference
内存使用情况,您可能无法做多少事情。有关详细信息,请参阅此question - 基本上某些对象实现finalize()
,这些对象的处理方式稍有不同,这样它们最终可能会更长时间。我没有仔细研究它,但我怀疑一些android sdk对象可以做到这一点而且除了可能调整对象缓存/回收以减少它之外你几乎无能为力。
我不确定这对FinalizerReference是否有帮助,但我想做的一件事就是找到可疑对象与GC根目录的连接。
如果你正在使用Eclipse hprof分析器(独立于实际的Eclipse IDE;使用android studio生成的hprofs),这是访问它的一种方法:
现在你应该看到一个嵌套引用列表,它从gc根目录返回到你的对象。
我不确定是什么原因造成的差异 - 这是一个similar question。显然,内存监视器工具可能只报告由Java代码生成的堆分配,而设备则报告整个进程的内存使用情况。
答案 1 :(得分:0)
如我在对my own similar question的答复中所指出的,Memory Profiler为FinalizerReference报告的“保留大小”目前是一个无意义的数字。
总结:在进行概要分析时(像Memory Profiler一样)将FinalizerReference像其他任何类一样对待,会导致在计算其保留大小时重复计数相同的内存。
我认为这是Android Studio内存分析器中的错误,并且已提交this issue。