文章目录
前言
1.什么是内存优化
2. 常见内存优化实战案例与原理分析
2.1 优化图片加载
2.1.1 解决方案
2.2 解决内存泄漏问题
2.3 优化数据结构
常见数据结构优化原则
具体优化方案与实战案例
前言
在移动应用开发中,内存优化一直是提升性能、避免崩溃、改善用户体验的重要任务。尤其在内存有限的 Android 设备上,优化内存使用能有效避免 ANR(应用无响应)和 OOM(内存溢出)问题。本文将结合常见场景和实际案例,带你深入探讨 Android 内存优化的核心技术和实用方法。
1.什么是内存优化
内存优化的意义在于降低内存使用峰值,减少内存泄漏,并提升应用的流畅度。以下是内存不足对应用的具体影响:
OOM 崩溃: 应用分配的内存超过限制,直接导致崩溃。
UI 卡顿:垃圾回收(GC)频繁触发,暂停应用线程,用户体验下降。
设备卡顿:内存占用过多,系统开始回收后台任务或强制终止应用。
类比场景: 搬家时,东西太多,车子装不下,反复装卸导致搬家效率低,甚至直接崩溃(车坏了)。 搬家车容量 = 应用分配的内存上限 东西太多 = OOM 崩溃 反复装卸 = 垃圾回收(GC)频繁执行,导致应用卡顿 优化内存就是在有限的车厢空间里,高效地装载东西,让搬家顺利进行。
Android 的内存管理机制
Android 应用运行在独立的虚拟机中(Dalvik 或 ART),内存管理主要依赖垃圾回收(GC)机制。GC 的核心原理是通过根搜索算法(Reachability Analysis)标记所有可达对象,并回收无法到达的对象。虽然 GC 可以自动管理内存,但它也会导致Stop-the-World (STW) 暂停,直接影响用户体验。
2. 常见内存优化实战案例与原理分析
2.1 优化图片加载
问题:加载高清大图时,内存占用激增,导致 OOM。
问题分析 加载一张图片时,图片的大小并不仅仅是文件的大小,而是解码后的像素数据占用的内存。
计算图片内存占用: 对于一张图片,其占用内存的公式为: 内存占用 = 宽度 * 高度 * 每像素字节数 ( 比如:RGBA格式 为 4字节) 例如: 4K 图片(3840 × 2160)使用 RGBA 格式: 3840 * 2160 * 4 = 31.6MB 如果同时加载多张图片,内存使用量会进一步飙升。
2.1.1 解决方案
以下只是提供思路,具体解决还是要看实际情况
一、 使用 BitmapFactory.Options 降低图片分辨率 如果图片实际显示的尺寸较小,可以使用 BitmapFactory.Options 进行按需采样加载。
代码示例:
fun decodeSampledBitmapFromResource(
res: Resources,
resId: Int,
reqWidth: Int,
reqHeight: Int
): Bitmap {
// 第一次加载,仅获取图片尺寸
val options = BitmapFactory.Options().apply {
inJustDecodeBounds = true }
BitmapFactory.decodeResource(res, resId, options)
// 计算采样率
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight)
// 实际加载图片
options.inJustDecodeBounds = false
return BitmapFactory.decodeResource(res, resId, options)
}
fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
val (height: Int, width