防止内存泄漏指导文档

1. 概述

 

 防止内存泄漏是一个体系工程,需要从事前预防、事中检测、事后补救三个方面对内存问题进行梳理和处理。

 事前预防是指在设计阶段、编码阶段就开展的预防内存泄漏的活动。

 设计阶段主要从模块设计、算法构建角度,尽可能避免对内存频繁的构建-释放,尽可能复用已构建好的对象。

 编码阶段则需注意养成良好的编程习惯,在使用完对象后尽早地显示地释放对象,同时配合代码Review机制,代码Reviewer审核待提交的代码,尽可能从中找出问题,然后打回本次提交记录,让代码提交人完善代码后再重新提交,再次进入新一轮的代码Review过程,同时在这不断反复的过程中,代码提交人对相关代码问题的认识和意识会不断增强,后续再犯此类问题的概率会大为降低。

 实践和数据证明,在编码阶段发现和修复问题的数量、难易度、成本是有优势的。在测试阶段、运营阶段发现问题再修复问题的成本是高昂的。

 事中检测是指在应用发布上线后,通过在线检测相关的系统信息,提前预判是否有内存问题发生的可能,这是基于一种预测技术的预防机制。

 事后补救是指在内存问题发生后,通过问题描述、工具辅助以定位和修复问题。

 此外,内存优化是一个持续渐进的过程。

 

 

2.事前预防

可采用5R原则来指导事前预防的工作,5R内容为:

  • Reckon(估算)

本条原则意为估算应用所需的内存大小在什么量级,以做到知己知彼,在后续使用内存时做到量入为出。

  • Reduce(减少内存分配及使用)

该原则意为使用分配内存时,尽量少地分配内存空间,比如分配一个循环计数整型变量i,能用short的就不要用int

  • Reuse(重用)

本条原则意为尽量复用内存,一则可减少内存分配空间,二来可提高程序运行效率,体现该条原则的例子是图片缓存。

  • Recycle(及时回收)

本条原则意为在资源不再使用时,要尽快释放所占用的资源,体现该条原则的例子是Bitmaprecyclecursorclose

  • Review(代码Review)

提交代码前review下自己的代码,以发现使用不规范的地方,以及代码提交到Gerrit后,其他程序员协助review的过程。

5R原则只是一个指导原则,用以训练程序员养成良好的编程习惯,在编码过程中,避免常见的内存泄漏类型。


在本项目中,经常出现的的内存泄漏类型如下:

  • Handler泄漏

  • static成员泄漏

  • Callback泄漏

  • Bitmap未即时释放

  • Activity leak window

  • cursor未关闭

在代码Review阶段,可重点留意这些方面的内存问题。

 

 

3.事中监测

借助一种收集系统运行过程产生的信息,动态分析应用是否会产生内存问题的技术,本文档不对这种技术做讨论。

 

 

4.事后补救

      在内存问题发生后,通过现场反馈的信息及内存分析工具的协助,以最终定位问题的过程。

      常用内存分析工具有Android MonitorDDMSMAT

 

posted @ 2018-08-29 15:52  tgltt  阅读(146)  评论(0编辑  收藏  举报