Я использую ConcurrentHashMap с объектами SoftReference, чтобы позволить JVM освобождать память под нагрузкой. Вот упрощенная версия моего кода:
Код: Выделить всё
public class SoftCache {
private final ConcurrentHashMap map = new ConcurrentHashMap();
public void put(K key, V value) {
map.put(key, new SoftReference(value));
}
public V get(K key) {
SoftReference ref = map.get(key);
return ref != null ? ref.get() : null;
}
public void cleanup() {
for (Iterator it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = it.next();
if (entry.getValue().get() == null) {
it.remove();
}
}
}
}
- Иногда объекты неожиданно исчезают из кэша, даже если использование памяти низкое.
- Иногда очистка() приводит к высокой загрузке ЦП при большой нагрузке.
- Я не уверен, что это так. потокобезопасен, когда cleanup() выполняется одновременно с get() и put().
- Есть ли проблемы с параллельным доступом в этой реализации, особенно с сотнями потоков?
- Как это сделать? SoftReferences взаимодействуют со сборщиком мусора при разной нехватке памяти? Почему кэшированные объекты могут неожиданно исчезнуть?
Подробнее здесь: https://stackoverflow.com/questions/798 ... ry-pressur