主要观点总结
Bitmap 是 Android 应用中内存占用大户,容易造成 OOM。Google 不断尝试优化 Bitmap 的内存分配和回收策略。深入理解 Bitmap 的内存模型是优化基础。文章深入 Android 6.0 和 8.0 系统源码,总结 Bitmap 运行时内存模型及 Native 内存回收策略。关键点包括 Bitmap 内存模型、不同版本分配策略、Native 内存回收兜底策略、Bitmap 创建过程、回收过程等。
关键观点总结
关键观点1: Bitmap 内存模型
Bitmap 由 Java Bitmap 对象、Native Bitmap 对象和图片像素数据三部分组成,像素数据在不同系统版本采用不同分配策略。
关键观点2: 不同版本分配策略
Android 3.0 前像素数据存 Native 堆,3.0 到 7.1 存 Java 堆,8.0 后存 Native 堆,并新增 Hardware Bitmap。
关键观点3: Native 内存回收兜底策略
Java Bitmap 对象提供 recycle() 方法释放内存,但 Native 内存需依赖 Finalizer 机制或引用机制辅助回收。
关键观点4: Bitmap 创建过程
Bitmap 创建涉及创建解码器、内存分配器、预分配像素数据内存、解码和返回 Java Bitmap 对象等步骤。
关键观点5: 回收过程
Bitmap 提供 recycle() 方法主动回收,Finalizer 机制或引用机制作为兜底策略确保 Java Bitmap 被回收时同时回收 Native 内存。
文章预览
前言 Bitmap 是 Android 应用的内存占用大户,是最容易造成 OOM 的场景。为此,Google 也在不断尝试优化 Bitmap 的内存分配和回收策略,涉及:Java 堆、Native 堆、硬件等多种分配方案,未来会不会有新的方案呢? 深入理解 Bitmap 的内存模型是有效开展图片内存优化的基础,在这篇文章里,我将深入 Android 6.0 和 Android 8.0 系统源码,为你总结出不同系统版本上的 Bitmap 运行时内存模型,以及 Bitmap 使用的 Native 内存回收兜底策略。知其然,知其所以然,开干! 学习路线图 1 认识 Bitmap 的内存模型 1. 不同版本的 Bitmap 内存分配策略 先说一下 Bitmap 在内存中的组成部分,在任何系统版本中都会存在以下 3 个部分: 1、Java Bitmap 对象:位于 Java 堆,即我们熟悉的 android.graphics.Bitmap.java ; 2、Native Bitmap 对象:位于 Native 堆,以 Bitmap.cpp 为代表,除此之外还包括与 Ski
………………………………