Spec-Zone.ru › OpenJDK 25

Пакет java.lang.ref

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

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

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

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

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

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

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

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

Уведомления

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

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

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

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

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

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

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

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе документации Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, способы обхода проблем и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/ref/package-summary.html

Spec-Zone.ru

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