一、缓存层级与设计目标
-
双级缓存:
-
内存缓存:弱引用 + LruCache
-
磁盘缓存:DiskLruCache
-
-
设计目标:
-
减少网络流量消耗
-
避免Bitmap频繁创建/销毁引发的GC
-
提升图片加载速度
-
二、内存缓存机制
1. 双缓存结构
缓存类型 | 存储对象 | 数据结构 | 特点 |
---|---|---|---|
弱引用 | 正在使用的图片 | HashMap | 快速访问,GC敏感 |
LruCache | 暂时未用的图片 | LinkedHashMap | LRU算法管理,容量可控 |
2. 关键实现原理
-
引用计数器(
EngineResource
):-
acquired
变量记录引用次数 -
acquire()
:引用+1(图片使用时调用) -
release()
:引用-1(图片释放时调用)
-
-
缓存转移规则:
if (resource.release()) {// 引用计数=0时:从弱引用移除 → 存入LruCachelruCache.put(key, resource); }
3. 存取流程
-
读顺序:弱引用 → LruCache
-
写顺序:磁盘 → 弱引用 → LruCache(释放时)
-
设计优势:
-
分压策略:弱引用减少LruCache的
trimToSize
频率(trimToSize
是LruCache(Least Recently Used Cache)中的核心方法,用于强制将缓存大小调整到指定容量范围内。当缓存数据总量超过预设的最大容量(maxSize)时,该方法会自动移除最近最少使用的条目,直到满足currentSize <= maxSize
的条件。) -
效率优化:HashMap访问效率高于LinkedHashMap
-
三、磁盘缓存机制
1. 缓存策略(DiskCacheStrategy)
策略 | 缓存内容 | 适用场景 |
---|---|---|
DATA | 原始图片数据 | 网络图片 |
RESOURCE | 转换后的图片(缩放/裁剪) | 本地图片 |
ALL | DATA + RESOURCE | 远程图片完整缓存 |
NONE | 不缓存 | 敏感数据 |
AUTOMATIC(默认) | 智能选择(远程:DATA;本地:RESOURCE) | 平衡性能与空间 |
2. 磁盘读写流程
-
读顺序:
-
ResourcesCacheGenerator
:查找转换后的缓存 -
SourceGenerator
:查找原始缓存 -
DataCacheGenerator
:网络下载并缓存
-
-
写顺序:
网络 → 磁盘(根据策略缓存DATA/RESOURCE) → 内存
3. 核心类协作
四、缓存流程图解
正确逻辑梳理
Glide缓存分为内存+磁盘两级:
1. 内存缓存
采用
弱引用+LruCache
双结构正在使用的图片存在弱引用(快速访问),暂时不用的移入LruCache
通过
acquired
引用计数器实现状态迁移2. 磁盘缓存
通过
DiskLruCache
实现支持5种策略
读取顺序:转换后缓存 → 原始缓存 → 网络下载
3. 整体流程
读顺序:弱引用 → LruCache → 磁盘 → 网络
写顺序:网络 → 磁盘 → 弱引用 → LruCache(释放时)
4.设计亮点:
弱引用分压减少LruCache扩容压力
引用计数器精准管理内存生命周期
磁盘缓存策略灵活适配不同场景