只有以下两个活动的项目将抛出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));
}
}
答案 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的工作方式。