1.什么是OOM

Android开发中经常会遇到OOM,而且现在已经是Android面试必问的问题了。
OOM(out of memory)即内存泄露。一个程序中,已经不需要使用某个对象,但是因为仍然有引用指向它垃圾回收器就无法回收它,当该对象占用的内存无法被回收时,就容易造成内存泄露。

Android的一个应用程序的内存泄露对别的应用程序影响不大,因为为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,也就是说每个应用程序都是在属于自己的进程中运行的。如果程序内存溢出,Android系统只会kill掉该进程,而不会影响其他进程的使用(如果是system_process等系统进程出问题的话,则会引起系统重启)。

2.OOM的原因

①一个进程的内存可以由2个部门组成:java 使用内存 ,C 使用内存 ,这两个内存的和必需小于16M,不然就会出现各人熟悉的OOM。

②一旦内存分配给Java后,以后这块内存纵然开释后,也只能给Java的使用,这个估计跟java虚拟机里把内存分成好几块进行缓存的原因有关,反正C就别想用到这块的内存了,所以要是Java突然占用了一个大块内存,纵然很快开释了,C能使用的内存 = 16M - Java某一瞬间占在的最大内存。 

③而Bitmap的生成是路程经过过程malloc进行内存分配的,占用的是C的内存。

④Java内存消耗 1.资源对象没关闭造成的内存泄露,try catch finally中将资源回收放到finally语句可以有效避免OOM。资源性对象比如
1-1,Cursor 1-2,调用registerReceiver后未调用unregisterReceiver() 1-3,未关闭InputStream/OutputStream 1-4,Bitmap使用后未调用recycle()
2.作用域不一样,导致对象不能被垃圾回收器回收,比如:
2-1,非静态内部类会隐式地持有外部类的引用
2-2,Context泄露
概括一下,避免Context相关的内存泄露,记住以下事情: 1、 不要保留对Context-Activity长时间的引用(对Activity的引用的时候,必须确保拥有和Activity一样的生命周期) 2、尝试使用Context-Application来替代Context-Activity 3、如果你不想控制内部类的生命周期, 应避免在Activity中使用非静态的内部类, 而应该使用静态的内部类,并在其中创建一个对Activity的弱引用。 这种情况的解决办法是使用一个静态的内部类, 其中拥有对外部类的WeakReference。 2-3,Thread 引用其他对象也容易出现对象泄露 2-4,onReceive方法里执行了太多的操作、
3.内存压力过大
  3-1,图片资源加载过多,超过内存使用空间,例如Bitmap 的使用
  3-2,重复创建view,listview应该使用convertview和viewholder

3.如何解决OOM

1.使用缓存技术,比如LruCacheDiskLruCache、对象重复并且频繁调用可以考虑对象池 推荐大神博客:Android高效加载大图、多图解决方案,有效避免程序OOM  Android照片墙应用实现,再多的图片也不怕崩溃
2.对于引用生命周期不一样的对象,可以用软引用或弱引用SoftReferner WeakReference
3.对于资源对象 使用finally 强制关闭
4.内存压力过大就要统一的管理内存
5.对于java中不再使用的资源需要尽快的释放,即设置成null,不要老是指望垃圾回收器为你工作。如果不设置成null,那么资源回收会受到一定的影响。
6.尽量少用static方法和static成员。因为static的方法或成员被外部使用的话,而外部的牵引对象没有对其进行释放的话那么整个static的类都不会被释放,也就造成内存泄漏。
7.对于不再使用的bitmap应该手动调用recycle方法,并且设置成null。图片还要尽量使用软引用方式,这样可以加快垃圾回收。

上面有些关键字提供了链接可供参考!

更多相关文章

  1. StevGuo系列文章翻译之Android系统属性
  2. Android自动接听和挂断电话实现原理
  3. 基于 Android(安卓)NDK 的学习之旅----- C调用Java
  4. Android中Settings.System的使用
  5. android 的Application应用
  6. 【Android】百度地图自定义弹出窗口
  7. Android检测Cursor泄漏的原理以及使用方法
  8. Android(安卓)性能优化&内存篇
  9. android camera 竖直拍照 获取竖直方向照片 做缩放处理

随机推荐

  1. Android(安卓)aapt 资源打包工具
  2. 2011.09.26(3)——— android sample之Note
  3. android 知识点
  4. Android在启动adb时失败解决方案?
  5. android如何判断服务是否正在运行状态
  6. Android虚拟按键的适配
  7. Android(安卓)gallery实现图片的左右循环
  8. android:interpolator
  9. Android4.4 Activity启动流程
  10. Windows下git下载android source