zoukankan      html  css  js  c++  java
  • 浅析LruCache原理

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

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

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

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

    [html] view plaincopy
     
    1.     public void trimToSize(int maxSize) {  
    2.         while (true) {  
    3.             K key;  
    4.             V value;  
    5.             synchronized (this) {  
    6.                 if (size 0 || (map.isEmpty() && size != 0)) {  
    7.                     throw new IllegalStateException(getClass().getName()  
    8.                             + ".sizeOf() is reporting inconsistent results!");  
    9.                 }  
    10.   
    11.                 if (size <= maxSize) {  
    12.                     break;  
    13.                 }  
    14.   
    15.                 Map.Entry<K, VtoEvict = map.eldest();  
    16.                 if (toEvict == null) {  
    17.                     break;  
    18.                 }  
    19.   
    20.                 key = toEvict.getKey();  
    21.                 value = toEvict.getValue();  
    22.                 map.remove(key);  
    23.                 size -= safeSizeOf(key, value);  
    24.                 evictionCount++;  
    25.             }  
    26.   
    27.             entryRemoved(true, key, value, null);  
    28.         }  
    29. }  

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

    原文:http://blog.csdn.net/flypu/article/details/38950951

  • 相关阅读:
    返回一个随机数组中的子数组中的数相加最大的和
    四则运算二之结果
    四则运算二
    UVA 11741 Ignore the Blocks
    UVA 1408 Flight Control
    UVA 10572 Black & White
    CF1138D(545,div2) Camp Schedule
    UVA 1214 Manhattan Wiring
    UVA 11270 Tiling Dominoes
    BZOJ 3261 最大异或和
  • 原文地址:https://www.cnblogs.com/l2rf/p/4313796.html
Copyright © 2011-2022 走看看