浅析LruCache原理

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小或者缓存为空。

时间: 2024-11-10 08:31:03

浅析LruCache原理的相关文章

浅析LRUCache原理(Android)

一. LruCache基本原理 LRU全称为Least Recently Used,即最近最少使用. 由于缓存容量是有限的,当有新的数据需要加入缓存,但缓存的空闲空间不足的时候,如何移除原有的部分数据从而释放空间用来放新的数据? LRU算法就是当缓存空间满了的时候,将最近最少使用的数据从缓存空间中删除以增加可用的缓存空间来缓存新数据. 这个算分的内部有一个缓存列表,每当一个缓存数据被访问的时候,这个数据就会被提到列表尾部,每次都这样的话,列表的头部数据就是最近最不常使用的了,当缓存空间不足时,就

Android 中LruCache 原理与编程

Android用LruCache来取代原来强引用和软引用实现内存缓存,因为据说自2.3以后Android将更频繁的调用GC,导致软引用缓存的数据极易被释放. LruCache使用一个LinkedHashMap简单的实现内存的缓存,没有软引用,都是强引用.根据LinkedHashMap的结构原理,最新的应该在尾端,旧的应该在头部.如果添加的数据大于设置的最大值,就删除最先缓存(头部)的数据来调整内存.他的主要原理在trimToSize方法中.需要了解两个主要的变量size和maxSize maxS

LruCache原理解析

LruCache是一个泛型类,它内部采用LinkedHashMap,并以强引用的方式存储外界的缓存对象,提供get和put方法来完成缓存的获取和添加操作.当缓存满时,LruCache会移除较早的缓存对象,然后再添加新的缓存对象.对Java中四种引用类型还不是特别清楚的读者可以自行查阅相关资料,这里不再给出介绍. 介绍源码前 先介绍LinkedHashMap一些特性 LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,

LruCache原理分析

使用LruCache作为图片的内存缓存,其内部使用LinkedHashMap作为实现基础,并且全部使用强引用.弱引用.软应用在android API9之后会被更容易回收,使得有潜在浪费资源的情况. ? 参考: http://blog.csdn.net/yudajun/article/details/41620647 难点: LinkedHashMap插入顺序理解. 对于访问顺序,为 true:对于插入顺序,则为 false 插入顺序排序,如果需要输出的顺序和输入时的相同,那么就选用LinkedH

浅析正则表达式 — 原理篇

其实这篇文章很久之前就应该发出来,由于种种原因没有发出来,如果这篇文章中有错误,还请大家指出,小弟并改正之,没有学不会的东西,只有不想学的东西,只要功夫深,铁杵磨成针,我的至理名言:吾生也有涯而知也无涯,以有涯随无涯,殆矣.我们只要坚持将其看完,相信大家的正则表达式会有一个提升空间!本文属于.NET正则表达式里面的内容,由于不同语言正则表达式有所不同. 首先先讲解下正则表达式的基础知识: 1.字符串的组成 对于字符串”123“而言,包括三个字符四个位置.如下图所示: 2.占有字符和零宽度 正则表

Android面试收集录10 LruCache原理解析

一.Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加.获取和删除这三类操作.如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的.当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存. 因此LRU(Least Recently Used)缓存算法便应运而生,LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象.采用LRU算法的缓存有两种:LrhCach

大话浅析DNS原理

★DNS 是啥? DNS 是洋文"Domain Name System"的缩写,直译过来就是"域名系统". ★DNS 有啥用? 咱们每天打交道的这个互联网,其底层的基石是"IP".IP 是"Internet Protocol"的缩写,中文就"互联网协议".咱们日常用的那些互联网软件(浏览器.聊天工具.下载工具等等)在工作时,必须依靠IP地址才能进行网络数据传输. "IP地址"是设计给软件

浅析 SpringMVC 原理和配置.

一.原理 Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,它能够帮你构建像Spring框架那样灵活和松耦合的Web应用程序,将请求处理的逻辑和视图中的渲染实现解耦. 1.DispatcherServlet是Spring MVC的核心 .Spring MVC 中的请求页面都会委托给DispatcherServlet来执行处理. 2.DispatcherServlet需要知道将请求发送给哪个控制器,所以DispatcherServlet会查询

浅析ajax原理与用法

1 ajax原理 Ajax(Asynchronous JavaScript and XML (异步的JavaScript和XML)),是一种快速创建 动态网页的技术,目的是显示动态局部刷新.通过XMLHttpResponse对象来向服务器发起异步请求,从服务器获取数据. (1) 异步的javascript: 使用javaScript语言及功能向服务器发起请求,当服务器处理完请求之后,自动执行 javaScript回调函数.(客户端可以不需要等到服务器响应才能运行) (2) XML是一种标记语言,