2011-03-09 136 views
0

这是我在Android中注意到的。如果您重新启动手机,您会发现可用内存的数量更多[例如HTC Wildfire的190 MB)。随着时间的推移,可用内存量不断减少。Android内存泄漏?

[这个免费的内存,我指的是一个统计,我从一个TaskKiller应用程序获得。我不信任这个应用程序来杀死我的其他应用程序,但用它来监视我的内存资源。]

是我的应用程序出了问题,或者在android中有内存问题[因为想要更好的术语]。

如果是的话,我作为开发人员可以阻止这种情况的发生。

+0

这是您正在使用的特定应用程序吗?如果是这样,那叫什么? – SK9 2011-03-09 09:36:21

+0

那么我有他们的负载安装。我就是你可能称之为“极客”的人。 – 2011-03-09 09:46:54

+0

[Apps](http://www.appbrain.com/user/ANAND.SAINATH/apps-on-the-htc-wildfire)我在手机上有 – 2011-03-09 09:47:48

回答

3

我不认为它们是“问题”,因为Android是以应用程序在后台工作的方式制作的。称它为多任务处理。这些应用程序会让你记忆。 (我假设你指的是RAM大小)

当手机开始,几乎所有的应用程序都在睡觉。慢慢地,后台服务,如同步和其他启动,他们开始占用内存。

这就是为什么你看到可用内存下降的原因。我不认为有什么可担心的,因为Android很好地处理内存管理。

尽管作为一名开发人员,您应该创建一个占用内存尽可能少的应用程序。

0

Android有垃圾收集,所以在这个级别这些不是泄漏。你不必担心。

+0

你知道你仍然可以泄漏内存吗? GC只是释放没有任何引用的对象。如果您在某处有循环引用或其他引用,则GC不会像您所期望的那样释放它们... – WarrenFaith 2011-03-09 09:27:48

+0

是的,我知道。但这不是阿南德的问题。 – SK9 2011-03-09 09:29:01

+0

但是,这仍然属于“我如何防止它成为开发者”。请牢记这一点! – 2011-03-09 09:33:03

0

这可能是因为你有一个正在泄漏内存的应用程序,但更普遍,出于性能考虑现代操作系统如Android往往会使用所有可用的内存作为高速缓存存储器,当一个应用程序需要它释放出来。

  • 如果您正在运行内存和应用程序无法启动,那么你如果一个特定的应用程序使用这似乎是太多的内存可能有泄漏
  • ,那么你可能有一个问题

只要你仍然可以运行,你需要,我就不会由于Android担心应用程序是这样做的工作。

作为一个开发者,从理论上讲,它很简单 - 不使用更多的资源比你的需要,并释放他们,当你与他们完成。但实际上,我们取得了不同程度的成功。

开发指南中的Application Resources部分是一个很好的开始,blog上通常有很好的文章。

1

Sheikh Aman在我打字的时候张贴了这篇文章,其中涵盖了很多我要说的内容 - 特别是关于任何多任务,多进程系统通常以最小和随时间开始,由于用户inter其他-action组件将被装起来从而减少可用的RAM等

至于实际的内存泄漏 - 这是对贫困码所有系统可能导致他们所以要尽量避免这似乎显示此行为的应用程序。为了避免造成他们自己,这是一个很好的文章,值得一读...Avoiding Memory Leaks

1

我不知道你是否在你的应用程序与此有任何问题,但我已经创造了一滴溶液,修复所有标准Android课程android的内存泄漏问题:http://code.google.com/p/android/issues/detail?id=8488#c51

public abstract class BetterActivity extends Activity 
{ 
    @Override 
    protected void onResume() 
    { 
    System.gc(); 
    super.onResume(); 
    } 

    @Override 
    protected void onPause() 
    { 
    super.onPause(); 
    System.gc(); 
    } 

    @Override 
    public void setContentView(int layoutResID) 
    { 
    ViewGroup mainView = (ViewGroup) 
     LayoutInflater.from(this).inflate(layoutResID, null); 

    setContentView(mainView); 
    } 

    @Override 
    public void setContentView(View view) 
    { 
    super.setContentView(view); 

    m_contentView = (ViewGroup)view; 
    } 

    @Override 
    public void setContentView(View view, LayoutParams params) 
    { 
    super.setContentView(view, params); 

    m_contentView = (ViewGroup)view; 
    } 

    @Override 
    protected void onDestroy() 
    { 
    super.onDestroy(); 

    // Fixes android memory issue 8488 : 
    // http://code.google.com/p/android/issues/detail?id=8488 
    nullViewDrawablesRecursive(m_contentView); 

    m_contentView = null; 
    System.gc(); 
    } 

    private void nullViewDrawablesRecursive(View view) 
    { 
    if(view != null) 
    { 
     try 
     { 
     ViewGroup viewGroup = (ViewGroup)view; 

     int childCount = viewGroup.getChildCount(); 
     for(int index = 0; index < childCount; index++) 
     { 
      View child = viewGroup.getChildAt(index); 
      nullViewDrawablesRecursive(child); 
     } 
     } 
     catch(Exception e) 
     {   
     } 

     nullViewDrawable(view); 
    }  
    } 

    private void nullViewDrawable(View view) 
    { 
    try 
    { 
     view.setBackgroundDrawable(null); 
    } 
    catch(Exception e) 
    {   
    } 

    try 
    { 
     ImageView imageView = (ImageView)view; 
     imageView.setImageDrawable(null); 
     imageView.setBackgroundDrawable(null); 
    } 
    catch(Exception e) 
    {   
    } 
    } 

    // The top level content view. 
    private ViewGroup m_contentView = null; 
} 
+0

我不知道有关nullViewDrawableRecursive函数,但我认为即使您调用System.gc()函数,它也只会将请求添加到垃圾回收器队列中,并不保证释放垃圾回收器。无论如何,非常感谢您的见解! – 2011-08-08 06:04:22

+0

我知道这很难相信,但尝试一下,它就像一个魅力! :) – swinefeaster 2011-08-08 07:23:49