LRU

来源:互联网 发布:yy静态头像psd源码 编辑:程序博客网 时间:2024/06/07 18:50

LRU目前使用的是googlecache

               Cache<String,byte[]> cacheBuilder = CacheBuilder.newBuilder().weakKeys().weakValues().maximumSize(10000000)        .expireAfterAccess(7, TimeUnit.DAYS)        .removalListener((RemovalListener<String, byte[]>) removalNotification -> {            logger.error("cache will remove : "+removalNotification.getKey());        }).build();

        

        Api在使用的时候几个参数

       CacheBuilder.weakKeys():使用弱引用存储键。当键没有其它(强或软)引用时,缓存项可以被垃圾回收。因为垃圾回收仅依赖恒等式(==),使用弱引用键的缓存用==而不是equals比较键。

CacheBuilder.weakValues():使用弱引用存储值。当值没有其它(强或软)引用时,缓存项可以被垃圾回收。因为垃圾回收仅依赖恒等式(==),使用弱引用值的缓存用==而不是equals比较值。

maximumSize基于容量回收,容易导致OOM

expireAfterAccess缓存项在给定时间内没有被读/写访问,则回收。请注意这种缓存的回收顺序和基于大小回收一样。

如果只用maximumSize,expireAfterAccess来保证过滤的数据,时间一长容易导致OOM

使用weakKeys,weakValues因为垃圾回收仅依赖恒等式(==),使用弱引用键的缓存用==而不是equals比较键。比较的是内存的地址,而不是对象。因此会导致一些问题,因为byte[]转换成string的时候,内存地址会发生变化,需要在看下,有什么更好的方案替代。   



new String(byte[]).intern();--即可解决


有兴趣的看下:http://blog.csdn.net/xlgen157387/article/details/47293517

原创粉丝点击