LRU

这篇博客探讨了LRU缓存的实现,重点介绍了Google的Cache API。文章提到了使用弱引用键(weakKeys)和弱引用值(weakValues)可能导致的问题,并指出基于最大容量(maximumSize)和过期时间(expireAfterAccess)回收策略可能引发的OOM异常。作者建议结合使用weakKeys和weakValues时需谨慎,因为它们基于内存地址比较,可能导致某些场景下的问题。针对byte[]转String后内存地址变化的问题,提出了使用`new String(byte[]).intern();`来解决。更多详情可见链接。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值