Предыстория
В библиотеке, которую я веду, у нас есть внутренняя карта, отслеживающая наш кэш.Пользователи библиотеки заинтересованы в том, чтобы иметь список доступа к этой карте, однако мы можем обеспечить это только путем копирования ее содержимого (по соображениям безопасности потоков).Идея состоит в том, чтобы кэшировать этот список при первом обращении к нему без значительных накладных расходов памяти при втором доступе.Для иллюстрации:
List<Bob> list = cache.asList();
List<Bob> otherList = cache.asList(); // use from cache, if still available
Проблема в том, что мы не хотим сохранять этот список навсегда, если он больше не нужен.Поскольку Java использует GC, мы подумали, что для этого было бы целесообразно использовать WeakReference
, чтобы разрешить использовать его, если он не собран.
Вопрос
Если у меня естьWeakReference<List<Bob>>
хранится в моем классе, что произойдет, если один из элементов станет слабо достижимым (что означает, что список слабо доступен)?Возможно ли, что GC решит просто собрать элемент внутри списка или будет искать все другие слабо достижимые объекты, ссылающиеся на него, а также собирать их, в этом случае список?
Проблема будет, еслиGC собрал элемент списка, и затем мы снова пытаемся получить доступ к списку (если это вообще возможно), что произойдет?
Разъяснения
Я неинтересуясь достижимостью списка, я знаю, что список находится внутри WeakReference
и что элементы не имеют отношения к его достижимости.Я забочусь о конкретном состоянии, в котором и список, и элемент списка слабо достижимы, и возможно ли, что GC собирает только элемент, но не сам список.Что именно GC делает в этом конкретном сценарии?