浅析LruCache原理
来源:互联网 发布:数据库归档日志清理 编辑:程序博客网 时间:2024/06/06 05:52
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小或者缓存为空。
1 2
- 浅析LruCache原理
- Lrucache浅析
- LruCache原理
- LruCache原理
- LruCache源码浅析
- LruCache实现原理
- Android LruCache技术原理
- LruCache 实现原理分析
- LruCache 实现原理分析
- 说说 LruCache 底层原理
- LRUCache的实现原理
- LruCache原理分析
- LruCache原理分析整理
- 内存缓存LruCache实现原理
- 内存缓存LruCache实现原理
- Android LruCache 实现原理解析
- 内存缓存LruCache实现原理
- 内存缓存LruCache实现原理
- 杂感
- ubuntu14.04 numlock 开机自动打开方法
- ios7毛玻璃效果实现
- 给刚入职开发者的几句心里话
- java中反射字段
- 浅析LruCache原理
- iOS求职之OC面试题
- win7 ubuntu 双系统卸载ubuntu
- sql cookbook 2.3 按字串排序问题
- iOS求职之C语言面试题
- ios block一定会犯的几个错误
- OpenCV2.49+VisualStudio2010开发环境配置
- springMVC easyUI filebox 单个文件上传
- iOS archive(归档)的总结