提问Glide - 缓存篇

都知道Glide有内存和磁盘缓存,它们的作用和读写场景是什么?

ActiveResources :HashMap + WeakReference

  • 如果当前对应的图片资源正在使用,则这个图片会被Glide放入活动缓存。

  • 读取:Engine.loadFromActiveResources(key) 优先读取ActiveResource缓存。

  • 写入:onEngineJobComplete(磁盘或原数据加载完成)、loadFromMemoryCache(从内存读取并移除然后写入ActiveResources)

  • 剔除:内存不足GC导致系统回收、EngineResource‘引用计数’为0时。

MemoryCache

  • 如果图片最近被加载过,并且当前没有使用这个图片,则会被放入内存中。

  • 读取:Engine.loadFromCache(key) , 在活动资源缓存没命中的前提下尝试读取内存缓存。

  • 写入:EngineResource.release()至引用数为0、ActiveResources被GC回收后。

  • 剔除:LRU算法规则。

ResourceCache

  • 被解码后的图片写入磁盘文件中,解码的过程可能修改了图片的参数(inSampleSize)、各种transform变换

  • 读取:当内存缓存未命中且要检查磁盘缓存时读取,如果命中就直接将数据解码并返回。

  • 写入:原图资源解码后,调用DecodeJob.notifyEncodeAndRelease(), 注意缓存key(ResourceCacheKey)

  • 剔除:LRU算法规则

DataCache

  • 图片原始数据在磁盘中的缓存(从网络、文件中直接获得的原始数据)

  • 读取:当以上缓存均未命中时读取,如果命中先将数据转换一下再解码并返回。

  • 写入:图片原始资源加载完成后,将其写入磁盘缓存(默认写入可配置),注意缓存key (DataCacheKey)

  • 剔除:LRU算法规则。

为什么要设计活动资源(ActiveResources)缓存?

activeResources就是一个弱引用的HashMap,用来缓存正在使用中的图片。这样可以保护这些正在使用的图片不会被LruCache算法回收掉。

缓存算法如何实现的?

内存:LRUCache 、 LinkedHashMap
磁盘:基于LinkedHashMap自己实现的DiskLruCache;两层磁盘缓存使用了不同的key而已。

BitmapPool又是何用?

复用创建过的Bitmap对象。

  • 写入:内存缓存溢出时、EngineResource.release()至引用数为0和ActiveResources被GC回收后如果不使用内存缓存,会直接将其放入bitmapPool等待复用。

  • 读取:需要创建Bitmap的地方,如果复用池已存在可用的bitmap则直接返回,没有则创建新的bitmap返回。

  • 剔除:超过size后溢出、不支持复用直接剔除。

当一个Bitmap从内存缓存 被动 的被移除(内存紧张、达到maxSize)的时候并不会被recycle。而是加入这个BitmapPool,只有从这个BitmapPool 被动被移除的时候,Bitmap的内存才会真正被recycle释放。

使用条件: 参考文档

  • Bitmap的inMutable需要为true。

  • Android 4.4及以上只需要被复用的Bitmap的内存必须大于等于需要新获得Bitmap的内存,则允许复用此Bitmap。

  • 4.4以下(3.0以上)则被复用的Bitmap与使用复用的Bitmap必须宽、高和Config相等,才允许复用。

  • 使用HardwareBitmap时不可复用。

Bitmap在什么情况下才被recycle释放内存?

  1. 如果bitmap对象无法复用,在内存缓存中被算法剔除后就会调用recycle释放内存。
  2. 当一个bitmap对象在bitmapPool中被算法移除时。

App内存吃紧时如何避免OOM?

监听onLowMemory、onTrimMemory回调,及时释放memoryCache、bitmapPool、arrayPool

参考

能力有限,错误难免,如您发现,还望赐教,评论交流,私信讨论。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容