gpt4 book ai didi

java - Android : dominator_tree does not show all the instances of some objects内存分析

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:50 24 4
gpt4 key购买 nike

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

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

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

Histogram

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

List objects with incoming references

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

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

Dominator_tree

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

最佳答案

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

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

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

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

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

enter image description here

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

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

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

enter image description here

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

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

关于java - Android : dominator_tree does not show all the instances of some objects内存分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30619643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com