Смешивание разных типов ссылок в одной коллекции
SoftReference
, WeakReference
, PhantomReference
может быть использован для настройки процесса сбора мусора. Все они расширяются Reference<T>
поэтому их можно смешивать в одной коллекции. Жесткие ссылки (наиболее распространенные) не распространяются Reference<T>
поэтому невозможно смешать жесткие и другие типы ссылок в одной коллекции. Я прав, и мы должны поставить CustomReference<T> extends Reference<T>
в коллекцию для достижения желаемого результата смешивания всех типов объектных ссылок в одной коллекции (Collection<Reference<T>>
)?
ОБНОВЛЕНИЕ: Таким образом, при написании SSCCE я обнаружил, что невозможно расширить Reference<T>
обычным способом (конструктор является локальным для пакета).
Таким образом, вопрос теперь обновляется до следующего: могу ли я с одним классом коллекции создать кеш, который всегда содержит некоторые объекты (скажем, 10), а другие возвращаются GC, когда память не позволяет? Есть ли другие способы сделать это, кроме предоставления пользовательских оберток для жестких и мягких ссылок и сохранения их в коллекции?
2 ответа
К несчастью Reference<T>
большинство не (и не может) быть разделено на подклассы напрямую, согласно его JavaDoc:
Поскольку эталонные объекты реализованы в тесном сотрудничестве с сборщиком мусора, этот класс не может быть напрямую разделен на подклассы.
Таким образом, вы не сможете легко (т.е. без уродливыхinstanceof
+ приведение) обрабатывать и мягкие / слабые / фантомные ссылки и обычные ссылки в одномCollection
,
Вы можете написать обертку, которая использует два отдельных Collection
объекты для обработки нормальных и мягких / слабых / фантомных ссылок или которые помещают их все в одно и то же Collection<Object>
и использует соответствующие instanceof
проверяет с помощью приведения, чтобы дифференцировать объекты.
Вы используете SoftReference, когда хотите, чтобы указанный объект оставался в живых до тех пор, пока у хост-процесса не осталось мало памяти. Объект не будет пригоден для сбора, пока сборщику не понадобится освободить память. Проще говоря, привязка SoftReference означает: "Закрепить объект, пока вы больше не сможете".
Напротив, используйте WeakReference, когда вы не хотите влиять на время жизни ссылочного объекта; Вы просто хотите сделать отдельное утверждение о ссылочном объекте, пока он остается живым. На право объекта на коллекцию не влияет наличие связанных WeakReferences. Нечто похожее на внешнее сопоставление экземпляра объекта и связанного свойства, где свойство нужно записывать только до тех пор, пока связанный объект жив, хорошо подходит для WeakReferences и WeakHashMap.
Последний - PhantomReference - сложнее охарактеризовать. Как и WeakReference, такая привязка PhantomReference не оказывает влияния на время жизни ссылочного объекта. Но в отличие от других ссылочных типов, невозможно даже разыменовать PhantomReference. В некотором смысле, это не указывает на то, на что он указывает, насколько звонящие могут сказать. Он просто позволяет связать некоторые связанные данные со ссылочным объектом - данные, которые впоследствии могут быть проверены и обработаны, когда PhantomReference поставлен в очередь в связанном ReferenceQueue. Обычно каждый получает тип из PhantomReference и включает некоторые дополнительные данные в этот производный тип. К сожалению, для использования такого производного типа требуется некоторое уныние.
больше информации в этой ссылке
http://download.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html
Добавлена еще одна ссылка http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html