android内存泄漏?
这是我在安卓系统中注意到的。如果重新启动手机,你会发现可用内存量会更多(比如HTC Wildfire的内存为190 mb)。随着时间的推移,可用内存量不断减少 [我指的这个可用内存是我从TaskKiller应用程序中获得的统计数据。我不相信这个应用程序会杀死我的其他应用程序,而是用它来监视我的内存资源。] 我正在使用的应用程序是否有问题,或者安卓系统是否存在内存问题(因为缺少更好的术语) 如果是的话,作为一名开发人员,我如何才能阻止这种情况发生。我不认为这是“问题”,因为安卓系统是以这样一种方式制造的,应用程序可以在后台工作。称之为多任务。这些应用程序需要占用内存。(我假设您指的是RAM大小) 当手机启动时,几乎所有的应用程序都处于休眠状态。慢慢地,诸如sync和else之类的后台服务启动,它们开始占用内存 这就是为什么你会看到空闲内存的下降。我不认为有什么可担心的,因为Android非常擅长内存管理 不过,作为一名开发人员,您应该创建这样一个占用尽可能少的内存的应用程序。我不认为它们是“问题”,因为Android是以这样一种方式制造的,即应用程序可以在后台工作。称之为多任务。这些应用程序需要占用内存。(我假设您指的是RAM大小) 当手机启动时,几乎所有的应用程序都处于休眠状态。慢慢地,诸如sync和else之类的后台服务启动,它们开始占用内存 这就是为什么你会看到空闲内存的下降。我不认为有什么可担心的,因为Android非常擅长内存管理android内存泄漏?,android,memory,memory-management,Android,Memory,Memory Management,这是我在安卓系统中注意到的。如果重新启动手机,你会发现可用内存量会更多(比如HTC Wildfire的内存为190 mb)。随着时间的推移,可用内存量不断减少 [我指的这个可用内存是我从TaskKiller应用程序中获得的统计数据。我不相信这个应用程序会杀死我的其他应用程序,而是用它来监视我的内存资源。] 我正在使用的应用程序是否有问题,或者安卓系统是否存在内存问题(因为缺少更好的术语) 如果是的话,作为一名开发人员,我如何才能阻止这种情况发生。我不认为这是“问题”,因为安卓系统是以这样一种方式
不过,作为一名开发人员,您应该创建这样一个占用尽可能少的内存的应用程序。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;
}