Параллельный кеш с использованием SoftReferences ведет себя непредсказуемо при нехватке памяти. Как исправить? [закрыто]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Параллельный кеш с использованием SoftReferences ведет себя непредсказуемо при нехватке памяти. Как исправить? [закрыто]

Сообщение Anonymous »

Я реализую уровень кэширования с высокой пропускной способностью на Java. К кешу одновременно обращаются сотни потоков, и в нем хранятся большие объекты.
Я использую 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»