У меня есть объект / класс 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
. Так что он будет содержать все больше и больше бесполезных экземпляров, что для меня выглядит как бомба замедленного действия.
Поэтому я хочу удалить из пула бесполезные (не ref by cache1) экземпляры. Простая идея - использовать другой кеш (cache2), а не instancePool. И дайте ему гораздо больше времени истечения. Но, похоже, это не идеальный способ.
Кажется, это общая проблема. Любая библиотека для этого?