防止内存泄漏指导文档
1. 概述
防止内存泄漏是一个体系工程,需要从事前预防、事中检测、事后补救三个方面对内存问题进行梳理和处理。
事前预防是指在设计阶段、编码阶段就开展的预防内存泄漏的活动。
设计阶段主要从模块设计、算法构建角度,尽可能避免对内存频繁的构建-释放,尽可能复用已构建好的对象。
编码阶段则需注意养成良好的编程习惯,在使用完对象后尽早地显示地释放对象,同时配合代码Review机制,代码Reviewer审核待提交的代码,尽可能从中找出问题,然后打回本次提交记录,让代码提交人完善代码后再重新提交,再次进入新一轮的代码Review过程,同时在这不断反复的过程中,代码提交人对相关代码问题的认识和意识会不断增强,后续再犯此类问题的概率会大为降低。
实践和数据证明,在编码阶段发现和修复问题的数量、难易度、成本是有优势的。在测试阶段、运营阶段发现问题再修复问题的成本是高昂的。
事中检测是指在应用发布上线后,通过在线检测相关的系统信息,提前预判是否有内存问题发生的可能,这是基于一种预测技术的预防机制。
事后补救是指在内存问题发生后,通过问题描述、工具辅助以定位和修复问题。
此外,内存优化是一个持续渐进的过程。
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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人