我有一个对象/类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。并给它更长的到期时间。但这似乎不是理想的方法。
这似乎是一个常见问题。有库可以这样做吗?