Garbage collection

Esempio:
class B { ... }
class A {
	static B b1;
	public B b2;
}

public class Tester {
	public static void main(String[] args) {
		B b1 = new B();
		B b2 = new B();
		A a1 = new A();
 		A a2 = new A();
		a1.b1 = b1;    //Siccome b1 è statica, tutte le istanze di tipo dinamico A puntano allo stesso oggetto
		a1.b2 = b1;    //In poche parole, implicitamente c'è scritto anche a2.b1 = b1
		a2.b2 = b2;
		a1 = null; 
		b1 = null;  //l'oggetto B() appena dereferenziato rimane referenziato dalla variabile d'istanza statica a2.b1
		b2 = null;
		(1)
		// altro codice
		}
}

Nello heap vengono creati 2 oggetti di tipo B e 2 oggetti di tipo A. L'oggetto referenziato da b1 viene referenziato dalla variabile d'istanza statica b1, quindi a1.b1 == a2.b1 == B() (di b1). L'oggetto referenziato da b2 viene referenziato anche da a1.b2, non è statico però. Esso viene poi referenziato anche da a2.b2. Facendo a1 = null;, si perde il riferimento all'oggetto A referenziato da esso, e con lui anche il riferimento di a1.b2. Quest'oggetto non è più riferito da nessuno. Facendo b1 = null; si perde l'oggetto B referenziato da b1, che però rimane ancora referenziato da a2.b1. Facendo b2=null; si perde l'oggetto B referenziato da b2, che però rimane referenziato ancora da a2.b2. Dunque l'unico oggetto ad aver perso ogni riferimento è quello inizialmente referenziato da a1, che è infatti anche l'unico a diventare garbage al termine delle istruzioni nel punto (1).