2012-02-07 53 views
3

我在Galaxy Nexus等设备中遇到问题,如果您继续打开活动,则会导致内存不足错误。我认为我有一些内存泄漏妨碍了活动的收集,但我找不到它。所以我写了这个小活动(纯粹是出于测试的目的。)系统在Galaxy Nexus内存不足之前未被系统损坏

public class Test extends Activity {  
    private byte[] imageData = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Button iv = new Button(this); 
      imageData = new byte[1024 * 1024 * 2]; 
      iv.setText("Open"); 
      iv.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
          startActivity(new Intent(Test.this, Test.class)); 
        } 
      }); 
      setContentView(iv); 
    } 
} 

因此,基本上,它分配2MB内存,并且可以开同一活动的另一个实例。在Galaxy S和Kindle Fire上,如果不断开放,内存使用量会增加到某个特定点,然后开始销毁旧活动以开展新活动。

但是在Galaxy Nexus的,它只是直到64MB和崩溃与内存不足的错误。

那么,有什么我不知道Android的内存管理,或者这是在某些设备上的错误吗?如果这是一个错误,我该如何解决它?

谢谢。

回答

1

我问戴安娜Hackborn这个(Android框架的一位工程师),这里是她给的建议是:

在其旧的活动被破坏是任意 号码的地点,基于总整个 系统的活动数量。这一直是这种情况。依靠 被破坏回收记忆的活动永远不会稳定; 活动管理器不知道任何关于 进程中RAM的数量或其RAM的限制或有多少RAM新活动是 将实际上有一个想法,当它应该尝试销毁 活动每个过程。

换句话说:你不能依靠系统销毁作为你自己的应用程序内存管理手段的活动。您仍然需要节约内存使用量,并在可能的情况下让自己的活动清理自己的内存使用情况。

在这种情况下,一旦调用onStop()onPause()就可以释放内存。

+0

“根据整个系统的活动总数,销毁旧活动的点数是一个任意数字” - 我觉得好奇的是,这与另一个SO答案相反,哈克博恩女士表示活动是从未销毁以释放内存,只有进程是:http://stackoverflow.com/a/7576275/115145任何机会,我可以让Googleland的任何人在那里写一篇Android开发人员博客帖子,并在这里发表权威声明?:-) – CommonsWare 2012-02-09 00:42:35

+0

(并且请注意,我并不赞同您的建议,这是AFAIK的专利,只是为了深入了解活动是否纯粹出于内存原因而被销毁) – CommonsWare 2012-02-09 00:46:11

+0

@CommonsWare(1/2 )我同意这个答案似乎与哈博恩女士的其他答案矛盾。然而,我只是好奇,如果所有关于这个问题的困惑都不能通过查看AOSP源代码来彻底放弃。与其他与android行为相关的其他事项(通常人们会引用源代码)中,与活动/流程生命周期有关的事项中,我主要看到理论上的答案(我并不争论;显然谷歌工程师知道的更好)。 – bitbybit 2016-09-12 19:15:34

1

据我所知,Android提供特定的内存给每个应用程序,如果你尝试运行比,你会得到VMBudgetOutOfMemory错误更多。 Nexus系列使用Android操作系统的通用版本,并且定制最少,而且完全取决于OEM,他们是如何定制设备操作系统和硬件(在您的情况下还有内存管理)。所以最好是自己处理活动的控制,否则Android会处理它。这种行为完全取决于特定的设备规范。

+0

谢谢。因此,如果我不能依靠系统来摆脱后台活动,是否有任何方法可以手动销毁它们,而无需将它们从后端堆栈中移除?我想要发布这些活动,但当用户单击后退按钮时仍会恢复。 – dasony 2012-02-07 07:24:30