解读Eclipse内存分析器的输出

3

我正在尝试追踪我的游戏应用程序中的内存泄漏。程序可以正常运行一次,但如果反复运行并关闭,最终会遇到某种内存不足错误。经过多次尝试安装和了解eclipse的内存分析器,我终于生成了下面截图中显示的数据。

我的应用程序基于一个名为SD_globals的单个应用程序:

public class SD_Globals extends Application
{
    int example_global_data = 99;
    // stuff
}

有五个不同的活动,每个活动都可以访问在SD_Globals中声明的各种全局数据。例如,其中之一是SD_gameplay:

public class SD_GamePlay extends Activity implements View.OnClickListener
{
    SD_Globals gs; // gs stands for global state

    gs = ((SD_Globals)getApplicationContext());

    // now I can access global variable using code like this:
    int x = gs.example_global_data;
}

看这个截图中的数据,重复出现的GamePlay看起来很奇怪。我猜可能是每次活动执行时都会创建新的活动,而没有被垃圾回收(我说得对吗?)...如果是这样的话,什么样的事情会导致这种情况呢?
编辑:如果我的解释完全偏离了轨道,那么在图片中是否还有其他可疑之处呢? enter image description here

1
你看过这个Google IO视频吗?http://www.youtube.com/watch?v=_CruQY55HOk 我相信它详细解释了如何使用内存分析器工具。我不记得具体要点击哪里,但我相信有一种方法可以查看每个对象,以查看哪个对象持有对它的引用,从而不让它被收集。应该在视频中详细描述。 - Tim
1个回答

1

SD_GamePlay$1SD_GamePlay$2和其他类似的名称并不是SD_GamePlay类的实例。它们只是SD_GamePlay类中的匿名内部类。SD_GamePlay$MicksPanelThingSD_GamePlay$MicksThreadThing则是SD_GamePlay类中的非匿名内部类。

$符号在名称中的解释:https://dev59.com/Hms05IYBdhLWcg3wDtpn#7484241


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接