4

我正在使用 Eclipse 内存分析器来测试MainActivity我的 Android 应用程序中的行为。

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

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

直方图

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

列出具有传入引用的对象

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

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

支配树

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

4

1 回答 1

1

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

支配者三只显示从 GC 根到它们至少有一条路径的对象。它需要至少一个引用才能显示在该图中(如果是弱引用、软引用、强引用或幻像引用,则无关紧要)。

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

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

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

在此处输入图像描述

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

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

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

在此处输入图像描述

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

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

于 2015-06-03T13:16:34.307 回答