`
liu86th
  • 浏览: 114769 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[转]内存管理 --- Android Out Of Memory(OOM) 的详细研究

 
阅读更多

基于Android开发应用时,可能会挺时常出现Out Of Memory 异常.

  在Android中,一个Process 只能使用16M内存,要是超过了这个限定就会跳出这个异常。这样就要求我们要时刻想着开释资源。Java的回收工作是交给GC的,如何让GC能实时的回收已经不是用的对象,这个里面有许多技巧,各人可以google一下。 

  因为总内存的施用超过16M而引起OOM的情况,非常简单,我就不继续展开说。值当注意的是Bitmap在不用时,肯定是要recycle,不然OOM是非常容易出现的。 

  本文想跟各人一起讨论的是另外一种情况:明明还有许多内存,但是发生OOM了。 

  这类情况时常出现在生成Bitmap的时候。有兴趣的可以试一下,在一个函数里生成一个13m 的int数组。

  再该函数结束后,按理说这个int数组应该已经被开释了,或者说可以开释,这个13M的空间应该可以空出来, 

  这个时候要是你继续生白手起家的百万富翁成一个10M的int数组是没有问题的,反而生成一个4M的Bitmap就会跳出OOM。这个就奇怪了,为啥子10M的int够空间,反而4M的Bitmap不敷呢? 

  这个问题困扰好久,在网上,国外各大论坛搜刮了好久,一般关于OOM的解释和解决方法都是,如何让GC尽快回收的代码风格之类,并没有现实的支出上面所说的情况的根源。 

  直到昨天在一个老外的blog上终于看到了这方面的解释,我理解后归纳如下: 

  在Android中: 

  1.一个进程的内存可以由2个部门组成:java 施用内存 ,C 施用内存 ,这两个内存的和必需小于16M,不然就会出现各人熟悉的OOM,这个就是熬头种OOM的情况。 

  2.越发奇怪的是这个:一朝内存分配给Java后,以后这块内存纵然开释后,也只能给Java的施用,这个估计跟java虚拟机里把内存分成好几块进行缓存的原因有关,反正C就别想用到这块的内存了,所以要是Java突然占用了一个大块内存,纵然很快开释了: 

  C能施用的内存 = 16M - Java某一瞬间占在校大学生创业点子用的最大内存。 

  而Bitmap的生成是路程经过过程malloc进行内存分配的,占用的是C的内存,这个也就说明了,上面所说的的4MBitmap无法生成的原因,因为在13M被Java用过后,剩下C能用的只有3M了。

分享到:
评论

相关推荐

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    android camera out of memory安卓照相机OOM问题的解决

    如果不能使用,请修改根目录下的project.property的android:target为你当前有的target(不知道怎么改的同学可以从8到21一个个数字去试哦) 程序实现点击屏幕后聚焦拍照功能,并把图片存入sd卡camera目录下。但打开时无...

    Android-OOM.rar_memory android_memory for Android_out

    关于Android out of memory错误的分析

    Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常

    主要介绍了Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常的相关资料,需要的朋友可以参考下

    Android内核驱动——内存管理.pdf

    Android 的内存管理机制是基于标准 Linux 内核的 Out of Memory (OOM) 机制修改而来的,称为 Low Memory Killer。Low Memory Killer 是一种改进的内存管理机制,它可以在系统内存不足时,杀死 Bad 进程释放其内存,...

    Android性能优化技术在某体重管理APP中的应用研究.pdf

    ANR(Application Not Responding)和 OOM(Out Of Memory)是 Android 应用程序中两个常见的问题。ANR 是指应用程序在 10 秒内没有响应用户事件,OOM 是指应用程序内存溢出错误。ANR 的原因是 BroadcastReceiver 10...

    Android内核和驱动篇-Android内核介绍

    3. 低内存管理器(Low Memory Killer):相对于 Linux 标准 OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程来释放需要的内存。源代码位于 drivers/staging/android/lowmemorykiller.c 低内存管理器驱动...

    解决Android解析图片的OOM问题的方法!!!

    我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。本篇文章主要讲诉了解决Android解析图片的OOM问题,有兴趣的可以...

    android图片缓存优化,内存缓存加sdcard缓存,性能很好,防止oom

    一个图片内存缓存和sdcard缓存的例子,经过很好的优化,性能很好,能有效的防止oom.

    解决Android平台中应用程序OOM异常的方法

    首先,OOM就是内存溢出,即Out Of Memory。也就是说内存占有量超过了VM所分配的最大。 怎么解决OOM,通常OOM都发生在需要用到大量内存的情况下(创建或解析Bitmap,分配特大的数组等),在这样的一种情况下,就可能...

    【性能】OOM原理解析:LowMemoryKiller原理

    1 概述 Android的设计理念之一,便是应用程序退出,但进程还会继续存在系统以便...Android基于Linux的系统,其实Linux有类似的内存管理策略——OOM killer,全称(Out Of Memory Killer), OOM的策略更多的是用于分配内存

    Android 内存泄漏的几种可能总结

    如果不小心,你的Android应用很容易浪费掉未释放的内存,最终导致内存用光的错误抛出(out-of-memory,OOM)。 一般内存泄漏(traditional memory leak)的原因是:当该对象的所有引用都已经释放了,对象仍未被释放。...

    Android内存回收机制

    Android内存回收机制策略 1、GC 2、lowmemorykiller GC GC是java虚拟机的内存...OOM(Out Of Memory) : Android内存管理机制及优化方法(https://www.2cto.com/kf/201805/741791.html) 简言之,即应用占用的最大内存

    Android 内存溢出和内存泄漏的问题

    内存溢出 (OOM)是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如只申请了一个integer,但给它存了long才能存下的数,那就会出现内存溢出。 内存泄露 (memory leak)是指程序在申请内存...

    Android利用软引用和弱引用避免OOM的方法

     在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。...

    Android内存泄漏的八种可能

    如果不小心,你的Android应用很容易浪费掉未释放的内存,最终导致内存用光的错误抛出(out-of-memory,OOM)。一般内存泄漏(traditionalmemoryleak)的原因是:当该对象的所有引用都已经释放了,对象仍未被释放。(译者...

    Android 加载大图、多图和LruCache缓存详细介绍

    大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少 int maxMemory = (int) (Runtime....

Global site tag (gtag.js) - Google Analytics