对OOM的理解
Posted zhujm320
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对OOM的理解相关的知识,希望对你有一定的参考价值。
什么是OOM?
oom(out of memory)是应用在申请分配内存时,系统无法分配足够的内存时出现。
OOM出现的原因
-
内存泄漏(对象生命周期不一致导致,长生命周期的对象持有短生命周期的对象,导致无法释放)
-
内存溢出(需要分配的内存,超过了系统需要,比如分配了1M内存,到时实际操作却操作了1M以外的内存)
-
碎片内存太多,连续完整的内存少
-
大型app确实需要消耗大量内存
-
文件句柄超出限制
-
线程数量超出限制
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的理解的主要内容,如果未能解决你的问题,请参考以下文章