Android 内存溢出(Out Of Memory)的总结

发表于 liuchengbao  http://labs.ywlx.net/?p=1689 

随着所做的游戏越来越复杂,图片越来越多,内存溢出已经成了不得不注意的问题了。

错误日志:11-03 12:36:54.812: ERROR/AndroidRuntime(5084): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget

内存溢出主要由以下几种情况引起:

1.数据库的cursor没有关闭。

2.构造adapter没有使用缓存contentview。

3.调用registerReceiver后未调用unregisterReceiver()。

4.未关闭InputStream/OutputStream。

5.Bitmap使用后未调用recycle()。

6.Context泄漏。

前5种情况容易发现和解决,只要把该关的及时关闭,该调用的方法及时调用,就不会有太多问题,另外java里还有软引用帮助管理内存:

SoftReference bitmap;
bitmap = new SoftReference(pBitmap);
if(bitmap != null){

if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}

下面着重介绍Context泄漏。

这是一个很隐晦的内存泄露的情况。先看一个Android官网提供的例子:

private static Drawable sBackground;@Overrideprotected void onCreate(Bundle state) {  super.onCreate(state);  TextView label = new TextView(this);  label.setText("Leaks are bad");  if (sBackground == null) {    sBackground = getDrawable(R.drawable.large_bitmap);  }  label.setBackgroundDrawable(sBackground);  setContentView(label);}

这段代码效率很快,但同时又是极其错误的;在第一次屏幕方向切换时它泄露了一开始创建的Activity。当一个Drawable附加到一个View上时,View会将其作为一个callback设定到Drawable上。上述的代码片段,意味着Drawable拥有一个TextView的引用,而TextView又拥有Activity(Context类型)的引用,换句话说,Drawable拥有了更多的对象引用。即使Activity被销毁,内存仍然不会被释放。

另外,对Context的引用超过它本身的生命周期,也会导致Context泄漏。所以尽量使用Application这种Context类型。这种Context拥有和应用程序一样长的生命周期,并且不依赖Activity的生命周期。如果你打算保存一个长时间的对象,并且其需要一个Context,记得使用Application对象。你可以通过调用Context.getApplicationContext()或Activity.getApplication()轻松得到Application对象。

最近遇到一种情况引起了Context泄漏,就是在Activity销毁时,里面有其他线程没有停。

总结一下避免Context泄漏应该注意的问题:

1.使用Application这种Context类型。

2.注意对Context的引用不要超过它本身的生命周期。

3.慎重的使用“static”关键字。

4.Context里如果有线程,一定要在onDestroy()里及时停掉。

 

更多相关文章

  1. Android(安卓)LayoutInflater 源码分析
  2. Android(安卓)API学习 SoundPool 和 MediaPlayer
  3. Android(安卓)Interface Definition Language (AIDL) android接
  4. Android(安卓)面试准备
  5. Android(安卓)Service 服务(三)—— bindService与remoteService
  6. Android(安卓)设置View 圆角
  7. Android驱动使用JNI调用
  8. android 实现home键效果
  9. Android(安卓)保存和恢复activity的状态数据

随机推荐

  1. android facebook authorize 时禁止调用f
  2. android使用javamail 发送邮件遇到的问题
  3. Android(安卓)studio图片ERROR: 9-patch
  4. Android:在WebView中获取网页源码
  5. android 按钮按下时改变字体颜色
  6. android 源码下载与编译(ubuntu11.04)
  7. Android(安卓)本地文件管理类
  8. Android(安卓)手势滑动切换activity
  9. android 自定义Android菜单背景的代码
  10. 浅析Android中的消息机制