对OOM的理解

Posted zhujm320

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对OOM的理解相关的知识,希望对你有一定的参考价值。

什么是OOM?

        oom(out of memory)是应用在申请分配内存时,系统无法分配足够的内存时出现。

OOM出现的原因

  1. 内存泄漏(对象生命周期不一致导致,长生命周期的对象持有短生命周期的对象,导致无法释放)

  2. 内存溢出(需要分配的内存,超过了系统需要,比如分配了1M内存,到时实际操作却操作了1M以外的内存)

  3. 碎片内存太多,连续完整的内存少

  4. 大型app确实需要消耗大量内存

  5. 文件句柄超出限制

  6. 线程数量超出限制

OOM解决方案

1. 内存泄漏

        内存泄漏的本质是长生命周期的对象持有短生命周期的对象,内存泄漏例子如下:

        单例导致内存泄漏(单例生命周期是整个程序运行周期)

        解决办法: 接收参数采用全局的生命周期的对象或者用弱引用来接收

        Thread导致内存泄漏(线程持有外部对象生命周期,外部对象生命周期必须长于线程声明周期,否者会导致内存泄漏)

        解决办法: 采用弱引用来接收

        WebView内存泄漏

        解决办法: 将webview单独放置一个进程,webview用的工作结束后,该进程自动退出

        Handler内存泄漏

        handler持有的对象可能生命周期结束了,而handler还没有结束

        解决办法:

        1. 将handler设置为静态

        2. 在Activity生命周期结束时调用Hanler.removeCallbacksAndMessages将属于该handler的Message从队列中清除掉

2.内存碎片化

        采用内存复用,避免短时间大量申请内存和释放内存,引发频繁GC,出现内存抖动和UI卡顿

3. 大型app确实内存不够,怎么办

        采用多进程,由于在android中一个进程使用的内存大小是固定的(在build.prop的dalvik.vm.heapsize=384m进行指定)。

4. 文件句柄超出限制

        一个进程同时打开的文件个数受到操作系统的限制,linux上是1024个, windows是512个

5. 线程数量超出限制

        一个进程同时打开线程的数量也受到操作系统限制,线程的个数取决于线程栈的大小,一般在1024个。

        android中开启线程数量个数界于 cpu核心数~2*cpu核心数

以上是关于对OOM的理解的主要内容,如果未能解决你的问题,请参考以下文章

对OOM的理解

对OOM的理解

深入理解Java虚拟机03:OOM异常

Linux vm运行参数 - OOM相关的参数

java面试-谈谈你对OOM的理解

理解和配置 Linux 下的 OOM Killer