我正在使用Eclipse Memory Analyzer来测试我的Android应用中MainActivity
的行为。
我已经将设备旋转了10次,因此我创建了11个MainActivity
类实例。
查看Eclipse Memory Analyzer中的Histogram选项卡,我得到了这个
整个列表对象(右键单击 - > lList对象 - >带有传入的引用)为我提供了这11个对象的列表:
sholud是正确的,因为我有预期的MainActivity类的11个实例(假设GC尚未发布这些活动)。
但是如果我在dominator_tree选项卡中搜索“MainActivity”,我只获得4个实例(我不确定这些是实例...可能它只显示我的应用程序中的活动引用,而不是所有对象都在堆):
其他6个实例在哪里?为什么这些没有显示在dominator_tree图中?
答案 0 :(得分:1)
分析dominator_tree
中显示的结果我理解发生了什么:
支配者3仅显示具有从GC根到它们的至少一条路径的对象。它需要至少一个参考才能显示在该图中(如果是弱参考,软参考,强参考或幻像参考,则不会参考)。
所以,我只能在Histogram
中看到的6个对象没有显示在dominator_tree
图中,因为它们没有引用它们(它们在堆中“浮动”)。
特别是一个对象(显然当前显示的Activity
)显示在dominator_tree
图表中,因为在我的应用程序中(出于测试目的)我使用PhantomReference
来跟踪GC对我的对象的活动。
这里显示了从dominator_tree
图表中获得的一个对象:
显示GC根(pr),它是一个静态变量,它为我的Activity维护PhantomReference
。事实上,我的活动中的代码(在onCreate()
回调中)是:
if(savedInstanceState==null)
pr = new PhantomReference(this, q); // q is the ReferenceQueue
同样有趣的是,即使没有我的PhantomReference
,多边形创建的活动始终显示在dominator_tree
图表中,因为它具有从{GC开始的Reference
活动root(Native Stack)。如下所示:
似乎Android为之前实例化的Activity使用了一种缓存。
总结: dominator_tree图仅显示从GC根目录到其中的至少一条路径的对象。直方图显示堆内存中的所有对象。