import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; public class Main { private Object inner = null; public void setInner(Object obj) { this.inner = obj; } public static void main(String[] args) throws Exception { // On crée deux objet A et B Main a = new Main(); Main b = new Main(); // A référence B a.setInner(b); // et B référence A b.setInner(a); // On utilise une ReferenceQueue et des PhantomReference // pour déterminer le moment où les objets seront libérés // (elle sont alors ajouté à la ReferenceQueue) ReferenceQueue queue = new ReferenceQueue(); PhantomReference refA = new PhantomReference(a, queue); PhantomReference refB = new PhantomReference(b, queue); // On perd les références de A et B : a = null; b = null; for (int i=0; i<2; i++) { // On tente de forcer le GC // (il peut être neccessaire de répéter cela ou bien // d'allouer d'autre objets selon l'implémentation du GC // pour qu'il libère vraiment la mémoire...) System.gc(); // On attend une référence pendant 1s maximum Reference ref = queue.remove(1000); // On détermine l'objet selon la référence String name = null; if (ref == refA) { name = "A"; } else if (ref == refB) { name = "B"; } System.out.println("L'objet '" + name + "' a été libéré..."); } } }