Ответ
Время жизни объекта в кэше зависит от типа используемых ссылок и реализации кэша.
Основные типы кэшей по ссылкам:
-
Кэш на сильных ссылках (Strong Reference Cache)
- Объект живет, пока на него есть сильная ссылка в кэше или другом месте.
- Удаляется только при явном вызове (например,
cache.remove(key)) или при завершении работы JVM. - Риск утечки памяти, если не управлять размером.
-
Кэш на мягких ссылках (SoftReference Cache)
- Объект может быть удален сборщиком мусора (GC) только при нехватке памяти в JVM.
- Используется для кэширования данных, которые желательно хранить, но не критично.
-
Кэш на слабых ссылках (WeakReference Cache)
- Объект будет удален GC при следующей сборке мусора, как только на него не останется сильных ссылок.
- Полезен для хранения метаданных, которые должны автоматически очищаться.
Практический пример с WeakHashMap:
import java.util.WeakHashMap;
public class CacheExample {
public static void main(String[] args) {
// WeakHashMap использует слабые ссылки для ключей
WeakHashMap<Key, String> cache = new WeakHashMap<>();
Key key1 = new Key("data1");
cache.put(key1, "Value for data1");
System.out.println("Before GC: " + cache.size()); // Вывод: 1
// Удаляем сильную ссылку на ключ
key1 = null;
// Принудительно запрашиваем сборку мусора (только для примера!)
System.gc();
try { Thread.sleep(100); } catch (InterruptedException e) {}
System.out.println("After GC: " + cache.size()); // Вывод: 0 (запись удалена)
}
}
class Key {
private String data;
Key(String data) { this.data = data; }
}
Вывод: Выбор типа кэша зависит от требований к жизненному циклу данных и управлению памятью.