¿Por qué WeakHashMap tiene una fuerte referencia al valor después de GC?

El objeto clave en WeakHashMap se volvió débilmente accesible. Y el mapa debe eliminar la entrada después de GC. Pero queda una fuerte referencia al objeto de valor. ¿Por qué?

El mismo comportamiento se observa con el mapa de guayaba débil.

Rendimiento esperado:

...
refKey.get = null
refValue.get = null

Pero obtengo salida:

map.keys = []
map.values = []
map.size = 0
refKey.get = null
refValue.get = (123)

Código:

import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;
import com.google.common.collect.MapMaker;

public class Test {

    static class Number {
        final int number;
        public Number(int number) { this.number = number; }
        public String toString() { return "(" + number + ")"; }
    }

    static class Key extends Number {
        public Key(int number) { super(number); }
    }

    static class Value extends Number {
        public Value(int number) { super(number); }
    }

    public static void main(String args[]) {

        //Map<Key, Value> map = new MapMaker().weakKeys().makeMap();
        Map<Key, Value> map = new WeakHashMap<>();

        Key key = new Key(1);
        Value value = new Value(123);

        map.put(key, value);

        WeakReference<Key> refKey = new WeakReference<>(key);
        WeakReference<Value> refValue = new WeakReference<>(value);

        key = null;
        value = null;

        System.gc();

        System.out.println("map.keys = " + map.keySet());
        System.out.println("map.values = " + map.values());
        System.out.println("map.size = " + map.size());
        System.out.println("refKey.get = " + refKey.get());
        System.out.println("refValue.get = " + refValue.get());

    }

}

UPD:

Intenté realizar GC en jСonsole y jcmd pero la salida no cambió.

Respuestas a la pregunta(3)

Su respuesta a la pregunta