定义 内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。 内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。 ——来自《百度百科》
影响 导致OOM
糟糕的用户体验
鸡肋的App存活率
成效 内存泄露是一个持续的过程,随着版本的迭代,效果越明显 由于某些原因无法改善的泄露(如框架限制),则尽量降低泄露的内存大小 内存泄露实施后的版本,一定要验证,不必马上推行到正式版,可作为beta版持续观察是否影响/引发其他功能/问题 内存泄露实施后,项目的收获:
OOM减少30%以上
平均使用内存从80M稳定到40M左右
用户体验上升,流畅度提升
存活率上升,推送到达率提升
类型 IO FileStream Cursor Bitmap Context
单例
Callback Service
BraodcastReceiver ContentObserver Handler
Thread
技巧 慎用Context Context概念
四大组件Context和Application的context使用参见下表 **善用Reference **
Java引用介绍 Java四种引用由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用 表格说明 **复用ConvertView **
复用详解
对象释放
遵循谁创建谁释放的原则
示例:显示调用clear列表、对象赋空值
分析 原理
Java内存分配机制
Java垃圾回收机制
根本原因
关注堆内存
怎么解决
详见方案 实践分析