为什么这会耗尽内存?不应该发布活动吗?

时间:2015-06-09 02:13:15

标签: android android-activity

只有以下两个活动的项目将抛出OutOfMemoryError。为什么会这样?当内存接近堆的限制时,不应该释放堆栈上的旧活动吗?

public class MainActivity extends Activity
{
    @Override
   protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startActivity(new Intent(getApplicationContext(), MemoryActivity.class));
    }
}

public class MemoryActivity extends Activity
{
    int[] testMem = new int[750000 * 3];

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startActivity(new Intent(getApplicationContext(), MainActivity.class));
    }

}

3 个答案:

答案 0 :(得分:2)

它是一个无限循环,你从MainActivity启动MemoryActivity,你再次从MemoryActivity启动MainActivity,这个循环继续。

A - > B - > A - > B - > A - > B .......

答案 1 :(得分:2)

似乎共识是文档已过时或具有误导性,因为如果活动的进程位于前台,即使该活动已停止,该活动也不会被杀死。一项活动将在其整个过程中被杀死。

请查看这个问题,由Dianne Hackborn回答,并讨论:Android app out of memory issues - tried everything and still at a loss

答案 2 :(得分:1)

我认为这更像是堆叠和堆叠的问题。活动被推送到堆栈中,在称为back stack的android中。在堆栈中,顶部元素下方的元素无法访问,直到弹出顶部元素。对于您的代码,这种情况永远不会发生。我很想知道(但尚未测试)如果从MemoryActivity中删除数组会导致堆栈溢出而不是OutOfMemoryError;)

如果生成新活动是使用堆而不是堆栈实现的(并且它不是),那么理论上android可以像你所说的那样释放内存。实际上,这正是Java garbage collecter的工作方式。