I saw this post a couple of days ago, but I thought I'd wait to see if someone who has actually used PhantomReference would give a definitive answer. They haven't, so here's mine.
PhantomReference is for doing clean-up just before an object is garbage collected. It is similar in purpose to finalisation, but less broken.
I think that a plain PhantomReference is fairly useless. That is because you cannot get its referent (the object being referred-to). The usual way to use it, therefore, would be to create a subclass of PhantomReference, containing the data necessary to perform the clean-up. This should not include the referent.
When you instantiate your subclass of PhantomReference, you need to enqueue it. Then you need a
thread to process the queue. Each time you take an item off the queue, you cast it to your subclass, then do whatever clean-up operation(s) your subclass provides.