Warum hält WeakHashMap einen starken Bezug zum Wert nach GC?

Key-Objekt in WeakHashMap wurde schwach erreichbar. Und Karte sollte der Eintrag nach GC entfernt werden. Ein starker Bezug zum Wertobjekt bleibt jedoch bestehen. Warum

Das gleiche Verhalten wird bei der Guaven-Schwachstellenkarte beobachtet.

Erwartete Ausgabe

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

Aber ich bekomme eine Ausgabe:

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

Code

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:

Ich habe versucht, GC in jСonsole und jcmd durchzuführen, aber die Ausgabe wurde nicht geändert.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage