Android中的内存分析:dominator_tree不会显示某些对象的所有实例

时间:2015-06-03 12:05:58

标签: java android eclipse memory-management eclipse-memory-analyzer

我正在使用Eclipse Memory Analyzer来测试我的Android应用中MainActivity的行为。

我已经将设备旋转了10次,因此我创建了11个MainActivity类实例。

查看Eclipse Memory Analyzer中的Histogram选项卡,我得到了这个

Histogram

整个列表对象(右键单击 - > lList对象 - >带有传入的引用)为我提供了这11个对象的列表:

List objects with incoming references

sholud是正确的,因为我有预期的MainActivity类的11个实例(假设GC尚未发布这些活动)。

但是如果我在dominator_tree选项卡中搜索“MainActivity”,我只获得4个实例(我不确定这些是实例...可能它只显示我的应用程序中的活动引用,而不是所有对象都在堆):

Dominator_tree

其他6个实例在哪里?为什么这些没有显示在dominator_tree图中?

1 个答案:

答案 0 :(得分:1)

分析dominator_tree中显示的结果我理解发生了什么:

支配者3仅显示具有从GC根到它们的至少一条路径的对象。它需要至少一个参考才能显示在该图中(如果是弱参考,软参考,强参考或幻像参考,则不会参考)。

所以,我只能在Histogram中看到的6个对象没有显示在dominator_tree图中,因为它们没有引用它们(它们在堆中“浮动”)。

特别是一个对象(显然当前显示的Activity)显示在dominator_tree图表中,因为在我的应用程序中(出于测试目的)我使用PhantomReference来跟踪GC对我的对象的活动。

这里显示了从dominator_tree图表中获得的一个对象:

enter image description here

显示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)。如下所示:

enter image description here

似乎Android为之前实例化的Activity使用了一种缓存。

总结: dominator_tree图仅显示从GC根目录到其中的至少一条路径的对象。直方图显示堆内存中的所有对象。