2009-08-04 2 views
5

Я просто покопаться в Викискладе И.О. библиотеки и нашел это:Подождите сборки мусора конкретного объекта

 
Keeps track of files awaiting deletion, and deletes them when 
an associated marker object is reclaimed by the garbage collector. 

Это можно найти в документации для FileCleaningTracker объекта.

Теперь мне просто интересно, как я могу это сделать сам? Как мой код может обнаруживать, когда объект регенерируется сборщиком мусора?

ответ

9

Согласно the source code, он использует класс PhantomReference. В соответствии с документацией:

Фантомные ссылочные объекты, которые находятся в очереди после сбора, определяют, что их референты могут быть повторно восстановлены. Фантомные ссылки чаще всего используются для планирования действий над вскрытием более гибким способом, чем это возможно с механизмом завершения Java.

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

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

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

PhantomReference конструктор принимает два аргумента:

referent - объект новый опорный фантом будет ссылаться на

q - очередь, с которой ссылка должна быть зарегистрирована, или нулевое значение, если регистрация не требуется

q аргумент является inst класс ReferenceQueue. PhantomReference будет добавлен к этому ReferenceQueue, когда он referent станет доступным для фантома. Когда это произойдет, вы можете получить PhantomReference с помощью методов poll() или remove() класса ReferenceQueue.

Например:

T objectToWatch = ...; 
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>(); 
new PhantomReference<T>(objectToWatch, referenceQueue); 

// Later on, probably in another thread... 
Reference<? extends T> nextReference = referenceQueue.remove(); 
// Tidy up! 

Примечание: PhantomReference имеет классы одноуровневые именованные SoftReference и WeakReference, которые также могут быть полезны. Связь между ними задокументирована в java.lang.ref package documentation.

1

Не уверен, что это действительно отвечает на ваш вопрос, но метод finalize() объекта вызывается до того, как его ресурсы будут восстановлены.

Редактировать: Это означает, что вы можете отправить сообщение другому объекту, чтобы предупредить его или что-то в этом роде.

+4

Не используйте финализаторы для этой цели или любые другие, если вы можете избежать этого. Нет никакой гарантии, что метод finalize() будет называться сразу после сбора мусора или даже что он будет вообще вызван (см. Эффективный Java 2nd Ed, Item 7). Пакет java.lang.ref - это путь. – Leigh

+0

Если вы можете помочь, не используйте финализаторы! http://stackoverflow.com/a/158791/74694 –

 Смежные вопросы

  • Нет связанных вопросов^_^