什么是OOM?
oom(out of memory)是应用在申请分配内存时,系统无法分配足够的内存时出现。
OOM出现的原因
-
内存泄漏(对象生命周期不一致导致,长生命周期的对象持有短生命周期的对象,导致无法释放)
-
内存溢出(需要分配的内存,超过了系统需要,比如分配了1M内存,到时实际操作却操作了1M以外的内存)
-
碎片内存太多,连续完整的内存少
-
大型app确实需要消耗大量内存
-
文件句柄超出限制
-
线程数量超出限制
OOM解决方案
1. 内存泄漏
内存泄漏的本质是长生命周期的对象持有短生命周期的对象,内存泄漏例子如下:
单例导致内存泄漏(单例生命周期是整个程序运行周期)
解决办法: 接收参数采用全局的生命周期的对象或者用弱引用来接收
Thread导致内存泄漏(线程持有外部对象生命周期,外部对象生命周期必须长于线程声明周期,否者会导致内存泄漏)
解决办法: 采用弱引用来接收
WebView内存泄漏
解决办法: 将webview单独放置一个进程,webview用的工作结束后,该进程自动退出
Handler内存泄漏
handler持有的对象可能生命周期结束了,而handler还没有结束