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

Memory analysis in Android: dominator_tree does not show all the instances of some objects

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

我已经将我的设备旋转了整整 10 次,所以我创建了 11 个 MainActivity class 实例。

查看 Eclipse 内存分析器中的直方图选项卡,我得到了这个

整个列表对象(右击 -> lList objects -> with incoming references)给我这 11 个对象的列表:

应该是正确的,因为我正好有 11 个 MainActivity 实例 class(假设 GC 尚未发布这些 Activity)。

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

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

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

支配者三只显示至少有一条从GC root到它们的路径的对象。它至少需要一个参考才能在该图中显示(无论是弱参考、软参考、强参考还是幻影参考)。

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

特别是一个对象(显然是当前显示的 Activity)显示在 dominator_tree 图中,因为在我的应用程序中(出于测试目的)我使用了 PhantomReference 进行追踪GC activity 对我的对象。

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

显示一个 GC 根 (pr),它是一个静态变量,它为我的 Activity 维护一个 PhantomReference。事实上,我的 activity 中的代码(在 onCreate() 回调中)是:

if(savedInstanceState==null)
    pr = new PhantomReference(this, q); // q is the ReferenceQueue 

有趣的是,同样没有我的 PhantomReference,创建的倒数第二个 Activity 总是显示在 dominator_tree 图表中,因为它有一个 Reference从 GC 根(本机堆栈)开始的活动。如下所示:

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

总结:dominator_tree 图只显示了至少有一条从 GC 根到它们的路径的对象。而 Histogram 显示了堆内存中的所有对象。