Se il tuo obiettivo è solo quello di tenere un registro di  quando  gli oggetti non vengono più utilizzati, guarderei  ReferenceQueue , che dovrebbe essere più efficiente dei tuoi loop costanti di   Reference.isEnqueued()    checks. 
 La scelta su quale  tipo  di riferimento usare è più complicata e dipende da quando si desidera essere avvisati e dal tipo di informazioni sull'oggetto che è necessario rendere disponibile. In particolare, guarderei anche  PhantomReference  come alternativa a WeakReference. 
 È un po 'rotonda, ma aggiungi elementi a   ReferenceQueue    passando la coda nel loro costruttore, per esempio: 
Foo targetFoo; /* stuff */
ReferenceQueue<Object> refq = new ReferenceQueue<Object>();
WeakReference<Foo> pr = new WeakReference(targetFoo, refq);
 In un thread separato, puoi eseguire il loop e attendere quando si verificano cambiamenti: 
Reference<Object> ref = fooQueue.remove(); // Blocks, poll() is also possible
 In questo modo, puoi avere un codice che monitora quando determinati oggetti non sono più strongmente raggiungibili. 
  PS:  Dal momento che il% originale di co_de potrebbe essere effettivamente eliminato, un modo per mantenere le informazioni su di esso è creare la sottoclasse   di   Foo   , una che memorizza le informazioni su   Reference    in modo che tu possa accedervi in seguito. 
Foo targetFoo; /* stuff */
ReferenceQueue<Object> refq = new ReferenceQueue<Object>();
// Use custom subclass of WeakReference
MyReference<Foo> ref = new MyReference(targetFoo, refq);
ref.setStuff("hello");
// Later, in another thread, etc.
MyReference<Object> ref = (MyReference<Object>) fooQueue.remove();
String msg = ref.getStuff();