Spec-Zone.ru › OpenJDK 24

Пакет java.lang.ref

package java.lang.ref
Предоставляет классы объектов-ссылок, которые поддерживают ограниченное взаимодействие с сборщиком мусора. Программа может использовать объект ссылки для поддержания ссылки на другой объект таким образом, что последний объект всё ещё может быть удалён сборщиком. Программа также может организовать уведомление о событиях через некоторое время после того, как сборщик определит, что достижимость данного объекта изменилась.

Объекты-ссылки

Объект-ссылка encapsulates ссылку на другой объект, чтобы сама ссылка могла быть проверена и изменена как любой другой объект. Предоставляются три типа объектов-ссылок, каждый из которых слабее предыдущего: мягкие, слабые и фантомные. Каждый тип соответствует разному уровню достижимости, как определено ниже. Мягкие ссылки предназначены для реализации кэшей, чувствительных к памяти; слабые ссылки — для реализации канонизирующих отображений, которые не препятствуют удалению их ключей (или значений); фантомные ссылки — для планирования действий по очистке после смерти объекта. Действия по очистке после смерти также могут быть зарегистрированы и управляемы Cleaner.

Каждый тип объектов-ссылок реализуется подклассом абстрактного базового класса Reference. Экземпляр одного из этих подклассов encapsulates единственную ссылку на конкретный объект, называемый referent. Каждый объект-ссылка предоставляет методы для получения и удаления ссылки. Помимо операции удаления, объекты-ссылки неизменны, поэтому предоставлена ни одна set операция. Программа может дополнительно создать подклассы этих подклассов, добавив необходимые поля и методы, или может использовать эти подклассы без изменений.

Достижимость

Достижимый объект — это любой объект, к которому можно получить доступ в любом потенциальном продолжении вычисления от любого активного потока (как указано в JLS 12.6.1).

От самого сильного к самому слабому, разные уровни достижимости отражают жизненный цикл объекта. Они операционально определены следующим образом:

  • Объект является строго достижимым, если он достижим и если к нему можно получить доступ без перехода через referent объекта-ссылки.
  • Объект является мягко достижимым, если он не строго достижим, но к нему можно получить доступ, перейдя по мягкой ссылке.
  • Объект является слабо достижимым, если он не строго и не мягко достижим, но к нему можно получить доступ, перейдя по слабой ссылке. Когда слабые ссылки на слабо достижимый объект удаляются, объект становится пригодным для окончательной обработки.
  • Объект является фантомно достижимым, если он не строго, не мягко и не слабо достижим, он был окончательно обработан, и на него ссылается какая-то фантомная ссылка.
  • Наконец, объект является недоступным и, следовательно, пригодным для освобождения, когда он недостижим ни одним из вышеперечисленных способов.

Уведомление

Программа может запросить уведомление о изменениях в достижимости объекта, зарегистрировав соответствующий объект ссылки с помощью ReferenceQueue. Это делается путем предоставления очереди ссылок в качестве аргумента конструктора при создании объекта-ссылки. Через некоторое время после того, как сборщик мусора определит, что достижимость referent изменилась в соответствии с типом ссылки, он удалит ссылку и добавит её в ассоциированную очередь. В этот момент ссылка считается записанной в очередь. Программа узнает об изменении достижимости referent, когда соответствующая ссылка станет доступна в очереди. Программа может удалять ссылки из очереди (то есть выдавать их из очереди) с помощью методов ReferenceQueue.poll() или ReferenceQueue.remove(). Дополнительные данные, необходимые для ответа на изменение достижимости referent, могут быть сохранены в полях пользовательского подкласса ссылки и доступны при возвращении ссылки из очереди.

Связь между зарегистрированным объектом-ссылкой и его очередью односторонняя. То есть, очередь не отслеживает ссылки, которые с ней зарегистрированы. Если зарегистрированная ссылка сама становится недостижимой, то она никогда не будет записана в очередь. Программа отвечает за обеспечение того, чтобы объекты-ссылки оставались доступными до тех пор, пока программа заинтересована в их referent.

Хотя некоторые программы предпочтут посвятить поток удалению объектов-ссылок из одной или нескольких очередей и их обработке, это никоим образом не обязательно. Тактика, которая часто работает хорошо, заключается в проверке очереди ссылок в ходе выполнения какой-либо другой довольно частой операции. Например, хеш-таблица, использующая слабые ссылки для реализации слабых ключей, может опросить свою очередь ссылок каждый раз, когда к таблице обращаются. Так работает класс WeakHashMap. Поскольку метод ReferenceQueue.poll просто проверяет внутреннюю структуру данных, эта проверка добавит небольшую нагрузку к методам доступа к хеш-таблице.

Свойства согласованности памяти

Некоторые взаимодействия между ссылками, очередями ссылок и сборщиком мусора образуют отношения happens-before:
  • Действия в потоке до вызова Reference.reachabilityFence(x) happens-before удаления сборщиком мусора любой ссылки на x.
  • Удаление ссылки сборщиком мусора happens-before запись ссылки в очередь сборщиком мусора.
  • Запись ссылки в очередь (сборщиком мусора или успешным вызовом Reference.enqueue()) happens-before извлечение ссылки из очереди (выдача из очереди).
  • Выдача ссылки на зарегистрированный объект потоком Cleaner happens-before запуск потоком Cleaner действия очистки для этого объекта.
Указанная цепочка happens-before обеспечивает, что действия в потоке до Reference.reachabilityFence(x) happens-before код очистки для x выполняется в потоке Cleaner. В частности, изменения состояния x, произведённые до reachabilityFence(x), будут видны коду очистки, выполняющемуся в потоке Cleaner, без дополнительной синхронизации. См. JLS 17.4.5.

Взаимодействие между ссылками, финализаторами и сборщиком мусора также образует отношение happens-before:

  • Действия в потоке до вызова Reference.reachabilityFence(x) happens-before выполнение финализатора для x потоком финализатора.
Это гарантирует, что действия в потоке до Reference.reachabilityFence(x) happens-before код очистки для x выполняется в потоке финализатора. В частности, изменения состояния x, произведённые до reachabilityFence(x), будут видны коду очистки, выполняющемуся в потоке финализатора, без дополнительной синхронизации. См. JLS 17.4.5.
Since:
1.2
Пакет Описание
java.lang
Предоставляет классы, основополагающие для разработки языка программирования Java.
Класс Описание
Cleaner
Cleaner управляет набором ссылок на объекты и соответствующими действиями очистки.
Cleaner.Cleanable
Cleanable представляет собой объект и действие очистки, зарегистрированное в Cleaner.
PhantomReference<T>
Фантомные объекты ссылок, которые записываются в очередь после того, как сборщик определил, что их referent могут быть удалены.
Reference<T>
Абстрактный базовый класс для объектов ссылок.
ReferenceQueue<T>
Очереди ссылок, в которые зарегистрированные объекты-ссылки добавляются сборщиком мусора после обнаружения соответствующих изменений достижимости.
SoftReference<T>
Мягкие объекты-ссылки, которые удаляются по усмотрению сборщика мусора в ответ на потребность в памяти.
WeakReference<T>
Слабые объекты ссылок, которые не препятствуют тому, чтобы их referent были сделаны окончательными, финализированы и затем удалены.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/ref/package-summary.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API