java.lang.ref.Cleaner
.
Each reference-object type is implemented by a subclass of the
abstract base java.
class.
An instance of one of these subclasses encapsulates a single
reference to a particular object, called the referent.
Every reference object provides methods for getting and clearing
the reference. Aside from the clearing operation reference objects
are otherwise immutable, so no set
operation is
provided. A program may further subclass these subclasses, adding
whatever fields and methods are required for its purposes, or it
may use these subclasses without change.
Going from strongest to weakest, the different levels of reachability reflect the life cycle of an object. They are operationally defined as follows:
java.lang.ref.ReferenceQueue
.
This is done by providing the reference queue as
a constructor argument when creating the reference object.
Some time after the garbage collector
determines that the reachability of the referent has changed to correspond
with the type of the reference, it will clear the
reference and add it to the associated queue. At this point, the
reference is considered to be enqueued. The program learns of the
referent's change in reachability when the associated reference becomes
available on the queue. The program may remove references from a queue
(that is, dequeue them) using the ReferenceQueue#poll()
or
ReferenceQueue#remove()
methods. Additional state needed to respond to a
referent's change in reachability can be stored in the fields of a custom
reference subclass, and accessed when the reference is returned from the
queue.
The relationship between a registered reference object and its queue is one-sided. That is, a queue does not keep track of the references that are registered with it. If a registered reference becomes unreachable itself, then it will never be enqueued. It is the responsibility of the program to ensure that reference objects remain reachable for as long as the program is interested in their referents.
While some programs will choose to dedicate a thread to
removing reference objects from one or more queues and processing
them, this is by no means necessary. A tactic that often works
well is to examine a reference queue in the course of performing
some other fairly-frequent action. For example, a hashtable that
uses weak references to implement weak keys could poll its
reference queue each time the table is accessed. This is how the
java.
class works. Because
the ReferenceQueue.
method simply checks an internal data
structure, this check will add little overhead to the hashtable
access methods.
Reference.reachabilityFence(x)
happen-before the garbage collector clears any reference to x
.Reference#enqueue
) happens-before
the reference is removed from the queue (dequeued).Reference.reachabilityFence(x)
happen-before cleanup code for x
runs on a Cleaner thread.
In particular, changes to the state of x
made before
reachabilityFence(x)
will be visible to the cleanup code running on
a Cleaner thread without additional synchronization.
See JLS 17.4.5.
The interaction between references, finalizers, and the garbage collector also forms a happens-before relationship:
Reference.reachabilityFence(x)
happen-before the finalizer for x
is run by a finalizer thread.Reference.reachabilityFence(x)
happen-before cleanup code for x
runs on a finalizer thread.
In particular, changes to the state of x
made before
reachabilityFence(x)
will be visible to the cleanup code running on
a finalizer thread without additional synchronization.
See JLS 17.4.5.
Modifier and Type | Class and Description |
---|---|
public class | Cleaner
|
pack-priv class | |
pack-priv class | FinalizerHistogram
This FinalizerHistogram class is for GC.finalizer_info diagnostic command support. |
pack-priv class | |
pack-priv class | |
public class | PhantomReference<
the type of the referent T>Phantom reference objects, which are enqueued after the collector determines that their referents may otherwise be reclaimed. |
public abstract class | |
public class | ReferenceQueue<
the type of the reference object T>Reference queues, to which registered reference objects are appended by the garbage collector after the appropriate reachability changes are detected. |
public class | SoftReference<
the type of the referent T>Soft reference objects, which are cleared at the discretion of the garbage collector in response to memory demand. |
public class | WeakReference<
the type of the referent T>Weak reference objects, which do not prevent their referents from being made finalizable, finalized, and then reclaimed. |