Этот вопрос уже имеет ответ здесь:
Я пытался понять различие между различными ссылками, но теория не вызывает идей для меня визуализировать то же.
Кто-либо мог объяснить вкратце различные ссылки?
Пример для каждого добился бы большего успеха.
Еще одна хорошая статья по теме:
Справочные объекты Java или Как я научился перестать беспокоиться и полюбить OutOfMemoryError , с красивыми диаграммами
Извлечение:
Как вы могли догадаться, добавление три новых необязательных состояния на диаграмме жизненного цикла объекта создают беспорядок.
Хотя в документации указывается логический переход от строго достижимого через мягкий, слабый и фантомный к исправленному, фактический прогресс зависит от того, какие ссылочные объекты создает ваша программа.
Если вы создаетеWeakReference
, но не создаетеSoftReference
, то объект сразу переходит от строго достижимого к слабодоступному, а затем к завершенному и собранному. жизненный цикл объекта со ссылочными объектами
Также важно помнить , что не все объекты привязаны к ссылочным объектам - фактически, очень немногие из них должны быть .
Ссылочный объект - это уровень косвенного обращения : вы проходите через ссылочный объект, чтобы достичь указанного объекта, и, очевидно, вам не нужен этот уровень косвенного обращения во всем вашем коде.
Фактически, большинство программ будут использовать ссылочные объекты для доступа к относительно небольшому количеству объектов, которые создает программа.
Ссылки и референты
Ссылочный объект обеспечивает уровень косвенного обращения между вашим программным кодом и некоторым другим объектом, называемым референтом.
Каждый ссылочный объект строится вокруг своего референта и предоставляет метод get () для доступа к референту. Создав ссылку, вы не можете изменить ее референт. После сбора референта метод get () возвращает значение null. отношения между кодом приложения, мягкой / слабой ссылкой и референтом
Еще больше примеров: Java Programming: References 'Package
alt text http://www.pabrantes.net/blog/space/start/2007 -09-16 / 1 / referenceTypes.png
Случай 1: Это обычный случай, когда объект считается сильно достижимым.
Случай 2: Есть два пути к объекту, поэтому выбирается самый надежный, который имеет сильную ссылку, следовательно, объект сильно достижим.
Случай 3: Снова есть два пути к объекту, самый сильный из которых - это слабая ссылка (так как другой является фантомной ссылкой), поэтому объект считается слабо достижимым.
Случай 4: существует только один путь, и самое слабое звено - это слабая ссылка, поэтому объект слабо достижим.
Случай 5: Только один путь и самое слабое звено - это фантомная ссылка, следовательно, объект является фантомно достижимым.
Случай 6: Теперь существует два пути, и самый надежный путь - это путь с мягкой ссылкой, поэтому объект теперь считается легко достижимым.
Есть действительно простое правило:
Object a = new Object()
. Объекты со ссылками не являются мусором, пока ссылка (a
, выше) является "достижимой". Следовательно, все, на что нет четкой ссылки, может считаться мусором. Таким образом, мы смотрим на не сильные типы ссылок:
WeakReference
будет очищено). Слабая ссылка на a
будет выглядеть как новое WeakReference
. Слабые ссылки полезны в том случае, если вам нужен кэш, в котором данные нужны только в том случае, если ключи существуют так же сильно, как и в других местах (например, HttpSessions)Я никогда не бываю слишком уверен насчет фантомных!
Статья, объясняющая эти виды ссылок (включая примеры): http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html