我有一个对象/类ClassA,其实例需要使用数千个键进行缓存(我们将其称为cache1)。但是实际上,ClassA的实例数限制为数百。
所以我想通过重用ClassA实例来压缩缓存的堆使用。
一种简单的方法是使用一个简单的池(也许这不是一个公共池):
final class ClassA {
private byte[] bytes;
private static final ConcurrentHashMap<String, ClassA> instancePool = new ConcurrentHashMap<>();
private ClassA(String bigString) {
bytes = bigString.getBytes();
}
public static ClassA getInstance(String key) {
instancePool.putIfAbsent(key, new ClassA(key));
return instancePool.get(key);
}
public byte[] getBytes() {
return bytes;
}
}
有效。但是问题在于实例可以更改,甚至不经常更改。缓存可以过期,但instancePool
不能过期。因此它将容纳越来越多的无用实例,对我而言,这就像一颗定时炸弹。
所以我想从池中清除无用的实例(不由cache1引用)。一个简单的想法是使用另一个cache(cache2)而不是instancePool。并给它更长的到期时间。但这似乎不是理想的方法。
这似乎是一个普遍的问题。有库可以这样做吗?
如果要根据时间使对象过期,可以使用jodah中的ExpiringMap。
赞:
Map<String, Integer> map = ExpiringMap.builder().expiration(30, TimeUnit.SECONDS).build();