OutOfMemoryError:何时转发"转储HPROF文件"

时间:2012-04-25 10:12:01

标签: java android eclipse

我的游戏应用程序存在某种内存问题。当我第一次运行它时,启动画面活动工作,关卡选择活动工作,然后游戏模式工作,我可以毫无问题地玩很多关卡。然后我退出游戏。然后第二次运行应用程序时,我得到一个OutOfMemoryError:位图大小超过VM预算,甚至在我看到启动画面之前。

我的应用程序基于一个名为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;
}

有关此设置可能出现的错误类型的任何想法都会受到欢迎 - 尽管这不是我的具体问题。

我已经阅读了一些关于使用DDMS和内存分析器来帮助诊断问题的内容,但有一件事我不清楚是什么时候按下“转储HPROF文件”按钮以获取最有用的信息。应该是在我的比赛还在比赛中,或者在我退出比赛之后(但在第二次比赛之前)还是在比赛结束后?

编辑:为了回应Akhil的回答,我将澄清我在每个单独活动的onCreate方法中使用getApplicationContext()一次,而不是其他任何实例。我还应该说,这个一般的应用程序结构(gs = ((SD_Globals)getApplicationContext()))已经在我的游戏的旧版本中运行得非常强大,这个版本已经上市了几个星期,并且有30,000次下载和零OutOfMemoryError报告回到Google Play。

1 个答案:

答案 0 :(得分:1)

除非您确定需要,否则

从不使用getApplicationContext()。它正在使你的资产应用程序作为范围,它们没有得到回收。坚持你可以像活动一样提供最狭窄的环境。改变它的所有出现。

由于这是一款游戏,我假设您使用的是位图。当他们所属的活动被破坏时,你回收它们(确保你将活动用作上下文而不是整个应用程序)。

需要定期从hprof转储堆(每个活动可能2-3个)。因此你可以看到内存泄漏的原因通过比较堆来与你分享时间。

这是我能提供的一般答案,因为这个问题是理论上的。