LRU目前使用的是google的cache
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