1. 概述程序员
防止内存泄漏是一个体系工程,须要从事前预防、事中检测、过后补救三个方面对内存问题进行梳理和处理。算法
事前预防是指在设计阶段、编码阶段就开展的预防内存泄漏的活动。编程
设计阶段主要从模块设计、算法构建角度,尽量避免对内存频繁的构建-释放,尽量复用已构建好的对象。缓存
编码阶段则需注意养成良好的编程习惯,在使用完对象后尽早地显示地释放对象,同时配合代码Review机制,代码Reviewer审核待提交的代码,尽量从中找出问题,而后打回本次提交记录,让代码提交人完善代码后再从新提交,再次进入新一轮的代码Review过程,同时在这不断反复的过程当中,代码提交人对相关代码问题的认识和意识会不断加强,后续再犯此类问题的几率会大为下降。工具
实践和数据证实,在编码阶段发现和修复问题的数量、难易度、成本是有优点的。在测试阶段、运营阶段发现问题再修复问题的成本是高昂的。测试
事中检测是指在应用发布上线后,经过在线检测相关的系统信息,提早预判是否有内存问题发生的可能,这是基于一种预测技术的预防机制。优化
过后补救是指在内存问题发生后,经过问题描述、工具辅助以定位和修复问题。编码
此外,内存优化是一个持续渐进的过程。spa
2.事前预防设计
可采用5R原则来指导事前预防的工做,5R内容为:
Reckon(估算)
本条原则意为估算应用所需的内存大小在什么量级,以作到知己知彼,在后续使用内存时作到量入为出。
Reduce(减小内存分配及使用)
该原则意为使用分配内存时,尽可能少地分配内存空间,好比分配一个循环计数整型变量i,能用short的就不要用int。
Reuse(重用)
本条原则意为尽可能复用内存,一则可减小内存分配空间,二来可提升程序运行效率,体现该条原则的例子是图片缓存。
Recycle(及时回收)
本条原则意为在资源再也不使用时,要尽快释放所占用的资源,体现该条原则的例子是Bitmap的recycle和cursor的close。
Review(代码Review)
提交代码前review下本身的代码,以发现使用不规范的地方,以及代码提交到Gerrit后,其余程序员协助review的过程。
5R原则只是一个指导原则,用以训练程序员养成良好的编程习惯,在编码过程当中,避免常见的内存泄漏类型。
在本项目中,常常出现的的内存泄漏类型以下:
Handler泄漏
static成员泄漏
Callback泄漏
Bitmap未即时释放
Activity leak window
cursor未关闭
在代码Review阶段,可重点留意这些方面的内存问题。
3.事中监测
借助一种收集系统运行过程产生的信息,动态分析应用是否会产生内存问题的技术,本文档不对这种技术作讨论。
4.过后补救
在内存问题发生后,经过现场反馈的信息及内存分析工具的协助,以最终定位问题的过程。
经常使用内存分析工具备Android Monitor、DDMS、MAT。