Android用LruCache来取代原来强引用和软引用实现内存缓存,因为据说自2.3以后Android将更频繁的调用GC,导致软引用缓存的数据极易被释放。

LruCache使用一个LinkedHashMap简单的实现内存的缓存,没有软引用,都是强引用。如果添加的数据大于设置的最大值,就删除最先缓存的数据来调整内存。他的主要原理在trimToSize方法中。需要了解两个主要的变量size和maxSize

maxSize是通过构造方法初始化的值,他表示这个缓存能缓存的最大值是多少。

size在添加和移除缓存都被更新值,他通过safeSizeOf这个方法更新值。safeSizeOf默认返回1,但一般我们会根据maxSize重写这个方法,比如认为maxSize代表是KB的话,那么就以KB为单位返回该项所占的内存大小。

    public void trimToSize(int maxSize) {while (true) {K key;V value;synchronized (this) {if (size < 0 || (map.isEmpty() && size != 0)) {throw new IllegalStateException(getClass().getName()+ ".sizeOf() is reporting inconsistent results!");}if (size <= maxSize) {break;}Map.Entry<K, V> toEvict = map.eldest();if (toEvict == null) {break;}key = toEvict.getKey();value = toEvict.getValue();map.remove(key);size -= safeSizeOf(key, value);evictionCount++;}entryRemoved(true, key, value, null);}
}

除异常外首先会判断size是否超过maxSize,,如果超过了就取出最先插入的缓存,如果不为空就删掉(一般来说只要map不为空都不会返回null,因为他是个双休链表),并把size减去该项所占的大小。这个操作将一直循环下去,直到size比maxSize小或者缓存为空。

浅析LruCache原理相关推荐

  1. 浅析bootstrap原理及优缺点

    网格系统的实现原理,是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统 网格系统的实现原理,是通过定义容器 ...

  2. LRUCache 原理

    目录 0.相关文章: 1.源码分析: 2.为什么用LinkedHashMap 0.相关文章: LRUCache源码分析(自己的,很详细) Glide--LruCache源码分析(文章一:阅读量152, ...

  3. 手把手带你学会Odoo OWL组件开发(5):浅析OWL原理

    [本系列内容直达:] 手把手带你学习Odoo OWL组件开发(1):认识 OWL 手把手带你学会Odoo OWL组件开发(2):OWL的使用 手把手带你学会Odoo OWL组件开发(3):核心内容指南 ...

  4. LruCache原理

    创建LruCache对象,重写其中的sizeOf方法: 然后看看LruCache内部长啥样子??? 看到A处,这里有个LinkedHashMap,这个是专门来存要缓存的对象,这个数据结构有个特点即链表 ...

  5. 浅析Kerberos原理,及其应用和管理

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/5269739.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  6. Android LRUCache原理

    关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存.这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻底理解Android中的缓存机制. 一.Androi ...

  7. Android基础-LruCache原理解析

    一.Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加.获取和删除这三类操作.如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大 ...

  8. 浅析ajax原理与用法

    1 ajax原理 Ajax(Asynchronous JavaScript and XML (异步的JavaScript和XML)),是一种快速创建 动态网页的技术,目的是显示动态局部刷新.通过XML ...

  9. TUN/TAP设备浅析(一) -- 原理浅析

    TUN/TAP设备浅析 TUN设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便地模拟网络行为.TUN 模拟的是一个三层设备,也就是说,通过它可以处理来自网络层的数据,更通俗一点的说,通过 ...

最新文章

  1. nginx重点优化合集一
  2. Jpa规范原始编程步骤
  3. boost::ratio_multiply相关的测试程序
  4. 【tomcat】tomcat部署项目实验
  5. python构造一个二叉树_二叉树-链表存储,用二叉树构造表达式(Python实现)
  6. Window入侵排查
  7. 普通人学python有意义吗-普通人为什么要学习Python?
  8. P2272 [ZJOI2007]最大半连通子图
  9. Matlab用巴特沃斯带通滤波器产生窄带高斯噪声并进行时域频域分析
  10. Tip3 百度网盘PC版去除广告和游戏运营位教程(百度网盘破解教程)
  11. 终端的乐趣--Linux下有趣的终端命令或者工具【转】
  12. java406错误_Java项目部署遇到406错误
  13. java else 语法错误_Java中带有else的语法错误
  14. 益聚星荣:海底捞要关300家店,火锅还有救吗?
  15. Clonezilla笔记----安装Clonezilla Live到U盘
  16. 北京新版城市总体规划解读
  17. gcc:扩展功能:除标准里定义的C特性之外的功能;-pedantic
  18. 谷粒商城:环境搭建(3)
  19. ssm水果商城项目遇到的问题和解决
  20. Restful风格的springMVC配搭ajax请求的小例子

热门文章

  1. Python中文转数字
  2. 肝了1个月!2022 顶会论文代码大合集!
  3. 5G安全,5G防御,5G网络安全,5G信息安全
  4. Vscode中搜索字符串失败,报错“Spawn ${path}\ressources\app\node_module.asar.unpacked\vs-code-ripgrep\bin\rg.exe“
  5. 南方电网计算机招聘笔试,南方电网招聘笔试题(附答案).PDF
  6. c语言不能输出字符A的语句的是,以下不能输出字符a的语句是( )。
  7. 深入理解Linux启动过程 0号进程,1号进程
  8. python钉钉机器人发送excel附件_python 钉钉机器人发送消息
  9. 如何查看主机名和IP地址
  10. Linux中修改httpd默认端口