Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android内存泄漏?_Android_Memory_Memory Management - Fatal编程技术网

android内存泄漏?

android内存泄漏?,android,memory,memory-management,Android,Memory,Memory Management,这是我在安卓系统中注意到的。如果重新启动手机,你会发现可用内存量会更多(比如HTC Wildfire的内存为190 mb)。随着时间的推移,可用内存量不断减少 [我指的这个可用内存是我从TaskKiller应用程序中获得的统计数据。我不相信这个应用程序会杀死我的其他应用程序,而是用它来监视我的内存资源。] 我正在使用的应用程序是否有问题,或者安卓系统是否存在内存问题(因为缺少更好的术语) 如果是的话,作为一名开发人员,我如何才能阻止这种情况发生。我不认为这是“问题”,因为安卓系统是以这样一种方式

这是我在安卓系统中注意到的。如果重新启动手机,你会发现可用内存量会更多(比如HTC Wildfire的内存为190 mb)。随着时间的推移,可用内存量不断减少

[我指的这个可用内存是我从TaskKiller应用程序中获得的统计数据。我不相信这个应用程序会杀死我的其他应用程序,而是用它来监视我的内存资源。]

我正在使用的应用程序是否有问题,或者安卓系统是否存在内存问题(因为缺少更好的术语)

如果是的话,作为一名开发人员,我如何才能阻止这种情况发生。

我不认为这是“问题”,因为安卓系统是以这样一种方式制造的,应用程序可以在后台工作。称之为多任务。这些应用程序需要占用内存。(我假设您指的是RAM大小)

当手机启动时,几乎所有的应用程序都处于休眠状态。慢慢地,诸如sync和else之类的后台服务启动,它们开始占用内存

这就是为什么你会看到空闲内存的下降。我不认为有什么可担心的,因为Android非常擅长内存管理

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

我不认为它们是“问题”,因为Android是以这样一种方式制造的,即应用程序可以在后台工作。称之为多任务。这些应用程序需要占用内存。(我假设您指的是RAM大小)

当手机启动时,几乎所有的应用程序都处于休眠状态。慢慢地,诸如sync和else之类的后台服务启动,它们开始占用内存

这就是为什么你会看到空闲内存的下降。我不认为有什么可担心的,因为Android非常擅长内存管理


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

Android具有垃圾收集功能,因此在这个级别上不会出现漏洞。你不必担心。

Android有垃圾收集功能,因此在这个级别上不会出现泄漏。你不必担心。

可能是你的应用程序内存泄漏,但更一般地说,出于性能原因,Android等现代操作系统倾向于使用所有可用内存作为缓存,在应用程序需要时释放内存

  • 如果内存不足且应用程序无法启动,则可能存在漏洞
  • 如果某个应用程序使用的内存似乎太多,那么您可能有问题
只要你仍然可以运行你需要的应用程序,我就不会担心,因为Android正在做它的工作

作为一名开发人员,从理论上讲,这很简单——不要使用超过您需要的资源,并在使用完资源后将其释放。然而,在实践中,我们取得了不同程度的成功


《开发指南》的这一部分是一个很好的起点,通常会有一些很好的文章。

可能是你的应用程序内存泄漏,但更一般地说,出于性能原因,现代操作系统(如Android)倾向于将所有可用内存用作缓存,在应用程序需要时释放

  • 如果内存不足且应用程序无法启动,则可能存在漏洞
  • 如果某个应用程序使用的内存似乎太多,那么您可能有问题
只要你仍然可以运行你需要的应用程序,我就不会担心,因为Android正在做它的工作

作为一名开发人员,从理论上讲,这很简单——不要使用超过您需要的资源,并在使用完资源后将其释放。然而,在实践中,我们取得了不同程度的成功


《开发指南》的这一部分是一个很好的开始,通常会有一些很好的文章。当我键入这篇文章时,Sheikh Aman发表了这篇文章,并涵盖了我将要说的很多内容,特别是关于任何多任务、多进程系统通常是如何以最短时间启动的,由于用户交互作用,其他组件将被加载,从而减少可用RAM等


至于实际的内存泄漏——在所有系统中,糟糕的代码都有可能导致内存泄漏,所以尽量避免出现这种情况的应用程序。为了避免自己引起这些问题,这是一篇很好的文章,值得一读。

谢赫·阿曼在我打字时发了这篇文章,涵盖了我要说的很多内容,特别是关于任何多任务、多进程系统通常是如何以最短时间开始的,由于用户交互作用,其他组件将被加载,从而减少可用RAM等


至于实际的内存泄漏——在所有系统中,糟糕的代码都有可能导致内存泄漏,所以尽量避免出现这种情况的应用程序。为了避免自己造成这些问题,这是一篇很好的文章,值得一读。

我不知道你的应用程序中是否有任何问题,但我已经创建了一个插件解决方案,修复了标准android类的所有安卓内存泄漏问题:

公共抽象类BetterActivity扩展活动
{
@凌驾
受保护的void onResume()
{
gc();
super.onResume();
}
@凌驾
受保护的void onPause()
{
super.onPause();
gc();
}
@凌驾
public void setContentView(int-layoutResID)
{
视图组主视图=(视图组)
LAYOUTINTFLATER.from(this).充气(layoutResID,null);
setContentView(主视图);
}
@凌驾
公共void setContentView(视图)
{
super.setContentView(视图);
m_contentView=(视图组)视图;
}
@凌驾
public void setContentView(视图视图,布局参数)
{
super.setContentView(视图,参数);
m_contentView=(视图组)视图;
}
@凌驾
受保护的空onDestroy()
{
super.ondestory();
//修复android内存问题8488:
// http://code.google.com/p/android/issues/deta
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;
}