A phantom reference is used to determine when an object is just about to be reclaimed. Phantom references are safer to use than finalization because once an object is phantom reachable, it cannot be resurrected.
// Create the phantom reference.
ReferenceQueue rq = new ReferenceQueue();
PhantomReference pr = new PhantomReference(object, rq);
// Wait until the object is about to be reclaimed.
try {
while (true) {
Reference r = rq.remove();
if (r == pr) {
// The object is about to be reclaimed.
// Clear the referent so that it can be reclaimed.
r.clear();
}
}
} catch (InterruptedException e) {
}