用条件/超时弱引用(Weak reference with a condition / timeou

2019-09-24 07:11发布

是否有可能在Java中创建一个弱引用,其对象可以被发送到垃圾收集器只在指定条件返回true

比方说,我有这样的事情,其ID号映射到一些数据的高速缓存:

Map<Integer, SomeData> cache = new HashMap<>();

SomeData有两个重要的方法- void updateTime()这只是设置到当前时间的内部变量,和boolean canBeDeleted()如果对象具有或没有在最后10分钟被使用(简单地通过比较当前时间和它检查保存的时间加上10分钟)。 如果它没有被用于该一定的时间,该方法返回true和对象可以从缓存中删除...

然而,当我创建弱引用而不是强缓存:

Map<Integer, WeakReference<SomeData>> cache = new HashMap<>();

那么唯一的WeakReference检查是可能的对象可能强引用,但我想,如果它也检查了我的条件canBeDeleted()并没有移除的参照,如果它返回false 。 有没有办法如何做到这一点?

(最重要的是,有内存泄漏,我不知道如何解决它...当了WeakReference内被删除的对象,地图还包含不必要的键/值对)。

提前致谢。

Answer 1:

你可以使用LinkedHashMap的#removeEldestEntry虽然它不提供你的方式根据时间进入的量,除去里面的缓存,它为您提供一个方法,以消除基于它是否被访问或没有条目。

它提供了机会,每一个新加入时间删除旧的条目实施者。 如果映射表示缓存,这非常有用:它允许通过地图删除陈旧的条目,以减少内存消耗。

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
  return size() > limit;

还记得你需要初始化的LinkedHashMap accessOrder true

accessOrder - 排序模式 - 真正的访问顺序,假的插入顺序。

所以,把他们放在一起源应该有如下

public class Cache<K, V> extends LinkedHashMap<K, V> {
    private final int MAX_ENTRIES = 100;
    public Cache() {
        super(16, 0.75f, true);// accessOrder is true
    }
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > MAX_ENTRIES;
    }
}


Answer 2:

你可以只取出钥匙在高速缓存中条件正确。



文章来源: Weak reference with a condition / timeout