Android(Coil,Glide)大量图片加载缓存清理问题(一)

牛马拉磨的公司是一个直播项目,后台队友反馈说某些图片资源(头像),资源调用很大...我就纳闷了,已经用Glide和Coil等开源库做多级缓存了,理论上不应该出现重复调用呀.

所以一键三连,做过了,没办法,重启试试???

Waht...不对...重启,这貌似就是移动端调用的问题.

问题流程:

Glide/Coil 加载大量图片后--->缓存不生效--->请求网络资源重新下载.

说明:

也就是说加载框架的缓存达到了临界值,为了加载新的资源清理了旧的资源为新资源腾空空间,导致其他用到旧的资源的地方需要重新加载(直播间,礼物聊天室,以及原先缓存的封面叠加)

1: 原先的Glide源码分析以及问题梳理

2: 三级缓存,LruCache,DiskLruCache重要概念

图片资源三级缓存说明

LruCache(内存缓存):一种基于 最近最少使用(LRU)算法 的内存缓存,用于快速存储和访问对象,存放在 RAM 中,进程结束后数据会丢失。

重点:超内存 → 直接删最久未用条目。

DiskLruCache(磁盘缓存) :一种基于 LRU 算法 的磁盘缓存,将对象以文件形式存储在磁盘上,支持较大容量,重启应用后仍可访问。

重点:超磁盘 → journal 找最久未用条目 → 删除对应文件。

3:问题梳理

Glide/Coil-->加载图片-->内存不存在-->加载磁盘(已达到临界值)-->开启下载网络资源-->磁盘运行时内存-->展示

因为磁盘空间已达到临界值,磁盘依据DiskLruCache算法清理了磁盘,为新资源腾空空间.

问题重现:

整个App共用了一个Glide和Coil的磁盘缓存,当大量资源(头像,封面,礼物等),占用了磁盘缓存,当直播间加载新的资源后导致磁盘缓存已经满了,就会陷入清理下载再清理再下载的循环怪圈.

简单比喻:

现在你把 全家人的冰箱都放在一个小柜子里,冰箱满了,拿东西时总是把你刚放的东西挤掉 → 永远吃不到新鲜食物。

磁盘缓存"循环挤占"问题,本质原因是:

  1. 全局共用磁盘缓存

    Glide / Coil 默认都是整个 App 公用一个 DiskCache。

    所有模块(头像、封面、礼物、直播资源)都写进同一个缓存目录。

  2. 缓存容量有限

    当直播间大量资源(大图、频繁更新)写入时,会触发 DiskLruCache 清理

    清理会删除 最久未使用 的文件,但在高频访问场景下,你想保留的"近期资源"也可能被误删,尤其是大资源占满空间时。

  3. 下载-清理-再下载循环

    典型链路:

    markdown 复制代码
    新资源下载
         ↓
    缓存满 → DiskLruCache 清理最久未用文件
         ↓
    被删掉的资源又被需要 → 重新下载
         ↓
    下载后再清理 → 无限循环

    这就是你说的 "循环怪圈"。

4:解决方案

App图片资源缓存,区分存储类型就可以了.日常的资源就执行,框架的缓存.特殊资源(礼物,头像),高频资源分开单独存储和加载.

  • 永久资源存储

  • 永久资源获取

总结

问题原因:

整个App用一个磁盘缓存池,导致缓存池满了,清理缓存,在高频加载的情况下导致资源频繁加载网络头像

问题处理:

多个磁盘缓存池缓存不同的资源

后续功能:

  • 缓存优先级 对不常用的大图,可以考虑 不写入磁盘缓存写入单独目录
  • 定时清理 后台定时清理
  • 缓存时效 对图片增加时效 后台清理超时的资源
相关推荐
仙俊红3 小时前
如何优化 MySQL 深分页 SQL
android·sql·mysql
awu的Android笔记3 小时前
网络闪断 + DNS 故障:Android弱网模拟中最容易被忽视的两个场景
android·tcp/ip
Flynt4 小时前
Android 17内存限制:我是怎么发现App被系统悄悄干掉的
android·性能优化
消失的旧时光-19434 小时前
Kotlin 协程设计思想(七):为什么 Kotlin 要设计 SupervisorJob 和 supervisorScope?
android·开发语言·kotlin
故渊at5 小时前
第一板块:Android 系统基石与运行原理 | 第五篇:Context 上下文与资源配置体系
android·人工智能·opencv·context·上下文·资源配置体系
故渊at5 小时前
第一板块:Android 系统基石与运行原理 | 第四篇:进程孵化(Zygote)与 Low Memory Killer 机制
android·虚拟机·zygote·系统启动·low memory·进程孵化
JohnnyDeng945 小时前
【Android】RecyclerView性能优化与缓存机制:从卡顿到丝滑的完整指南
android·性能优化·kotlin·mvvm
zfoo-framework5 小时前
kotlin中体会到一些比较好用的点
android·开发语言·kotlin
●VON7 小时前
AtomGit Flutter鸿蒙客户端:文件树与代码浏览
android·服务器·安全·flutter·harmonyos·鸿蒙
故渊at14 小时前
系列三:组件化与模块化进阶 | 第11篇 组件化项目规范与问题根治:依赖、资源、Manifest 与混淆的全链路管控
android·架构·mvvm·模块化·组件化