Spec-Zone.ru › OpenJDK 27

Класс Cleaner

java.lang.Object
java.lang.ref.Cleaner
public final class Cleaner extends Object
Cleaner управляет набором ссылок на объекты и соответствующих действий очистки.

Действия очистки регистрируются для выполнения после того, как сборщик уведомит о том, что объект стал фантомно достижимым. Сборщик использует PhantomReference и ReferenceQueue, чтобы получать уведомления об изменении достижимости.

Каждый сборщик работает независимо, управляя ожидающими действиями очистки и обрабатывая потоки и завершение работы, когда сборщик больше не используется. Регистрация ссылки на объект и соответствующего действия очистки возвращает Cleanable. Наиболее эффективный способ использования — явно вызывать метод clean, когда объект закрыт или больше не нужен. Действие очистки — это Runnable, которое вызывается не более одного раза, когда объект становится фантомно достижимым, если только очистка уже не была выполнена явно. Обратите внимание, что действие очистки не должно ссылаться на регистрируемый объект. В противном случае объект не станет фантомно достижимым, и действие очистки не будет вызвано автоматически.

Действие очистки выполняется потоком, связанным со сборщиком. Все исключения, выброшенные действием очистки, игнорируются. Исключения в действии очистки не влияют на сборщик и другие действия очистки. Поток работает до тех пор, пока все зарегистрированные действия очистки не будут завершены, а сам сборщик не будет освобождён сборщиком мусора.

Поведение сборщиков во время System.exit зависит от реализации. Никаких гарантий относительно того, будут ли вызваны действия очистки, не предоставляется.

Если не указано иное, передача аргумента null конструктору или методу этого класса приводит к выбрасыванию NullPointerException.

Примечание к API:
Действие очистки вызывается только после того, как связанный с ним объект становится фантомно достижимым, поэтому важно, чтобы объект, реализующий действие очистки, не содержал ссылок на этот объект. В этом примере статический класс инкапсулирует состояние очистки и действие. Нельзя использовать «внутренний» класс, анонимный или нет, поскольку он неявно содержит ссылку на внешний экземпляр, не позволяя ему стать фантомно достижимым. Выбор между созданием нового сборщика и использованием существующего определяется конкретным сценарием.

Если CleaningExample используется в блоке try-finally, метод close вызывает действие очистки. Если метод close не вызывается, действие очистки вызывается Cleaner, когда экземпляр CleaningExample становится фантомно достижимым.

public class CleaningExample implements AutoCloseable {
       // A cleaner (preferably one shared within a library,
       // but for the sake of example, a new one is created here)
       private static final Cleaner cleaner = Cleaner.create();

       // State class captures information necessary for cleanup.
       // It must hold no reference to the instance being cleaned
       // and therefore it is a static inner class in this example.
       static class State implements Runnable {

           State(...) {
               // initialize State needed for cleaning action
           }

           public void run() {
               // cleanup action accessing State, executed at most once
           }
       }

       private final State state;
       private final Cleaner.Cleanable cleanable;

       public CleaningExample() {
           this.state = new State(...);
           this.cleanable = cleaner.register(this, state);
       }

       public void close() {
           cleanable.clean();
       }
   }
Действие очистки может быть лямбда-выражением, но оно легко может захватить ссылку на объект, например при обращении к его полям, что не позволит объекту стать фантомно достижимым. Использование статического вложенного класса, как показано выше, позволяет избежать случайного сохранения ссылки на объект.

Действия очистки должны быть готовы к параллельному вызову с другими действиями очистки. Как правило, действия очистки должны выполняться очень быстро и не блокировать работу. Если действие очистки блокируется, оно может задержать обработку других действий очистки, зарегистрированных в том же сборщике. Все действия очистки, зарегистрированные в одном сборщике, должны быть взаимно совместимы.

Начиная с:
9

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static interface  Cleaner.Cleanable
Cleanable представляет объект и действие очистки, зарегистрированные в Cleaner.

Краткое описание методов

Модификатор и тип Метод Описание
static Cleaner create()
Возвращает новый Cleaner.
static Cleaner create(ThreadFactory threadFactory)
Возвращает новый Cleaner, используя Thread из ThreadFactory.
Cleaner.Cleanable register(Object obj, Runnable action)
Регистрирует объект и действие очистки, которое будет выполнено, когда объект станет фантомно достижимым.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, является ли другой объект «равным» этому объекту.
protected void finalize()
Устарело, планируется удаление: этот элемент API может быть удалён в будущей версии.
Финализация объявлена устаревшей и может быть удалена в будущем выпуске.
final Class<?> getClass()
Возвращает класс среды выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения заданного промежутка времени.

Подробное описание методов

create

public static Cleaner create()
Возвращает новый Cleaner.

Сборщик создаёт daemon thread для обработки фантомно достижимых объектов и вызова действий очистки. Для потока устанавливается загрузчик классов контекста, равный системному загрузчику классов.

Работа сборщика завершается, когда он становится фантомно достижимым и все зарегистрированные действия очистки выполнены.

Возвращает:
новый Cleaner

create

public static Cleaner create(ThreadFactory threadFactory)
Возвращает новый Cleaner, используя Thread из ThreadFactory.

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

Работа сборщика завершается, когда он становится фантомно достижимым и все зарегистрированные действия очистки выполнены.

Параметры:
threadFactory — ThreadFactory, возвращающий новый Thread для выполнения действий очистки
Возвращает:
новый Cleaner
Выбрасывает:
IllegalThreadStateException — если поток, полученный от фабрики потоков, не является новым потоком.

register

public Cleaner.Cleanable register(Object obj, Runnable action)
Регистрирует объект и действие очистки, которое будет выполнено, когда объект станет фантомно достижимым. Предупреждения о поведении действий очистки см. в приведённом выше примечании к API.

Указанный объект сохраняется сильно достижимым (и поэтому не подлежит очистке) на протяжении выполнения метода register().

Эффекты согласованности памяти: действия в потоке, выполненные до вызова Cleaner.register(), происходят до выполнения действия очистки потоком Cleaner.

Параметры:
obj — объект для отслеживания
action — Runnable, вызываемый, когда объект становится фантомно достижимым
Возвращает:
экземпляр Cleanable

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе документации Java SE, содержащем более подробные описания для разработчиков, включая концептуальные обзоры, определения терминов, способы обхода проблем и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, 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.

Spec-Zone.ru

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