Каково время жизни объекта в Java Cache?

«Каково время жизни объекта в Java Cache?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Время жизни объекта в кэше зависит от типа используемых ссылок и реализации кэша.

Основные типы кэшей по ссылкам:

  1. Кэш на сильных ссылках (Strong Reference Cache)

    • Объект живет, пока на него есть сильная ссылка в кэше или другом месте.
    • Удаляется только при явном вызове (например, cache.remove(key)) или при завершении работы JVM.
    • Риск утечки памяти, если не управлять размером.
  2. Кэш на мягких ссылках (SoftReference Cache)

    • Объект может быть удален сборщиком мусора (GC) только при нехватке памяти в JVM.
    • Используется для кэширования данных, которые желательно хранить, но не критично.
  3. Кэш на слабых ссылках (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; }
}

Вывод: Выбор типа кэша зависит от требований к жизненному циклу данных и управлению памятью.