¿La cadena de referencia débil no recogió la basura? ¿Cómo?

Estoy leyendo sobreWeakReference En wikipedia y vi este código.

public class ReferenceTest {
        public static void main(String[] args) throws InterruptedException {

            WeakReference r = new WeakReference(new String("I'm here"));
            WeakReference sr = new WeakReference("I'm here");

            System.out.println("before gc: r=" + r.get() + ", static=" + sr.get());
            System.gc();
            Thread.sleep(100);

            // only r.get() becomes null
            System.out.println("after gc: r=" + r.get() + ", static=" + sr.get());

        }
}

Cuando se ejecuta este es el resultado.

antes de gc: r = estoy aquí, estática = estoy aquí

después de gc: r = null, static = Estoy aquí

sr yr Las variables son ambos objetos de cadena de referencia.r ahora es basura recolectada pero, porquesr ¿No se recogió la basura después de llamar al recolector de basura?

Sólo tengo curiosidad de cómo sucedió esto.

Respuestas a la pregunta(3)

Su respuesta a la pregunta